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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9d7621df6e8b3c38023e15bfaf5ddaadd584939
4
- data.tar.gz: f7d0872485ad3b1aeb5d6b189de5b939ad6b563e
3
+ metadata.gz: 7b7da9cf7cc2a13ab9973f7c94b5d95eaf31c351
4
+ data.tar.gz: dd9a83a80fa8ee7614900ee4be39877d26d66682
5
5
  SHA512:
6
- metadata.gz: c3fa1b4e354c39f3b12ba11ac0f0b1771bc4c11eb9d0d864df697eac017da532d80204a8e304c4395e65dbd562e37bd39cf51ffd32964716175bfdf8a05ca303
7
- data.tar.gz: 489ab0ff996d026347bdd968d17a3a1e3968ba8a028780c66c2c5b0837f296b49c7346293af9baaeaf1a182cc21fd155573425f5a457b11640c747067f86422e
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 char* get_name_from_instance_id(int instance_id, int maximum_instances, int *instance_ids, char **instance_names) {
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 decode_single_metric(pmid, pm_result->vset[0], metric_name);
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(pmid, pm_result, metric_name);
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 pcpeasy_class) {
171
- pcpeasy_agent_class = rb_define_class_under(pcpeasy_class, "Agent", rb_cObject);
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
@@ -21,6 +21,6 @@
21
21
 
22
22
  #include <ruby.h>
23
23
 
24
- void pcpeasy_agent_init(VALUE pcpeasy_class);
24
+ void pcpeasy_agent_init(VALUE rb_cPCPEasy);
25
25
 
26
26
  #endif
@@ -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 pcpeasy_class) {
161
- pcpeasy_error = rb_define_class_under(pcpeasy_class, "Error", rb_eStandardError);
162
- pcpeasy_pmns_error = rb_define_class_under(pcpeasy_class, "PMNSError", pcpeasy_error);
163
- pcpeasy_no_pmns_error = rb_define_class_under(pcpeasy_class, "NoPMNSError", pcpeasy_error);
164
- pcpeasy_dup_pmns_error = rb_define_class_under(pcpeasy_class, "DupPMNSError", pcpeasy_error);
165
- pcpeasy_text_error = rb_define_class_under(pcpeasy_class, "TextError", pcpeasy_error);
166
- pcpeasy_app_version_error = rb_define_class_under(pcpeasy_class, "AppVersionError", pcpeasy_error);
167
- pcpeasy_value_error = rb_define_class_under(pcpeasy_class, "ValueError", pcpeasy_error);
168
- pcpeasy_timeout_error = rb_define_class_under(pcpeasy_class, "TimeoutError", pcpeasy_error);
169
- pcpeasy_no_data_error = rb_define_class_under(pcpeasy_class, "NoDataError", pcpeasy_error);
170
- pcpeasy_reset_error = rb_define_class_under(pcpeasy_class, "ResetError", pcpeasy_error);
171
- pcpeasy_name_error = rb_define_class_under(pcpeasy_class, "NameError", pcpeasy_error);
172
- pcpeasy_pmid_error = rb_define_class_under(pcpeasy_class, "PMIDError", pcpeasy_error);
173
- pcpeasy_indom_error = rb_define_class_under(pcpeasy_class, "InDomError", pcpeasy_error);
174
- pcpeasy_inst_error = rb_define_class_under(pcpeasy_class, "InstError", pcpeasy_error);
175
- pcpeasy_unit_error = rb_define_class_under(pcpeasy_class, "UnitError", pcpeasy_error);
176
- pcpeasy_conv_error = rb_define_class_under(pcpeasy_class, "ConvError", pcpeasy_error);
177
- pcpeasy_trunc_error = rb_define_class_under(pcpeasy_class, "TruncError", pcpeasy_error);
178
- pcpeasy_sign_error = rb_define_class_under(pcpeasy_class, "SignError", pcpeasy_error);
179
- pcpeasy_profile_error = rb_define_class_under(pcpeasy_class, "ProfileError", pcpeasy_error);
180
- pcpeasy_ipc_error = rb_define_class_under(pcpeasy_class, "IPCError", pcpeasy_error);
181
- pcpeasy_eof_error = rb_define_class_under(pcpeasy_class, "EOFError", pcpeasy_error);
182
- pcpeasy_not_host_error = rb_define_class_under(pcpeasy_class, "NotHostError", pcpeasy_error);
183
- pcpeasy_eol_error = rb_define_class_under(pcpeasy_class, "EOLError", pcpeasy_error);
184
- pcpeasy_mode_error = rb_define_class_under(pcpeasy_class, "ModeError", pcpeasy_error);
185
- pcpeasy_label_error = rb_define_class_under(pcpeasy_class, "LabelError", pcpeasy_error);
186
- pcpeasy_log_rec_error = rb_define_class_under(pcpeasy_class, "LogRecError", pcpeasy_error);
187
- pcpeasy_not_archive_error = rb_define_class_under(pcpeasy_class, "NotArchiveError", pcpeasy_error);
188
- pcpeasy_log_file_error = rb_define_class_under(pcpeasy_class, "LogFileError", pcpeasy_error);
189
- pcpeasy_no_context_error = rb_define_class_under(pcpeasy_class, "NoContextError", pcpeasy_error);
190
- pcpeasy_profile_spec_error = rb_define_class_under(pcpeasy_class, "ProfileSpecError", pcpeasy_error);
191
- pcpeasy_pmid_log_error = rb_define_class_under(pcpeasy_class, "PMIDLogError", pcpeasy_error);
192
- pcpeasy_indom_log_error = rb_define_class_under(pcpeasy_class, "InDomLogError", pcpeasy_error);
193
- pcpeasy_inst_log_error = rb_define_class_under(pcpeasy_class, "InstLogError", pcpeasy_error);
194
- pcpeasy_no_profile_error = rb_define_class_under(pcpeasy_class, "NoProfileError", pcpeasy_error);
195
- pcpeasy_no_agent_error = rb_define_class_under(pcpeasy_class, "NoAgentError", pcpeasy_error);
196
- pcpeasy_permission_error = rb_define_class_under(pcpeasy_class, "PermissionError", pcpeasy_error);
197
- pcpeasy_connlimit_error = rb_define_class_under(pcpeasy_class, "ConnLimitError", pcpeasy_error);
198
- pcpeasy_again_error = rb_define_class_under(pcpeasy_class, "AgainError", pcpeasy_error);
199
- pcpeasy_is_conn_error = rb_define_class_under(pcpeasy_class, "IsConnError", pcpeasy_error);
200
- pcpeasy_not_conn_error = rb_define_class_under(pcpeasy_class, "NotConnError", pcpeasy_error);
201
- pcpeasy_need_port_error = rb_define_class_under(pcpeasy_class, "NeedPortError", pcpeasy_error);
202
- pcpeasy_non_leaf_error = rb_define_class_under(pcpeasy_class, "NonLeafError", pcpeasy_error);
203
- pcpeasy_type_error = rb_define_class_under(pcpeasy_class, "TypeError", pcpeasy_error);
204
- pcpeasy_thread_error = rb_define_class_under(pcpeasy_class, "ThreadError", pcpeasy_error);
205
- pcpeasy_no_container_error = rb_define_class_under(pcpeasy_class, "NoContainerError", pcpeasy_error);
206
- pcpeasy_bad_store_error = rb_define_class_under(pcpeasy_class, "BadStoreError", pcpeasy_error);
207
- pcpeasy_too_small_error = rb_define_class_under(pcpeasy_class, "TooSmallError", pcpeasy_error);
208
- pcpeasy_too_big_error = rb_define_class_under(pcpeasy_class, "TooBigError", pcpeasy_error);
209
- pcpeasy_fault_error = rb_define_class_under(pcpeasy_class, "FaultError", pcpeasy_error);
210
- pcpeasy_pmda_ready_error = rb_define_class_under(pcpeasy_class, "PMDAReadyError", pcpeasy_error);
211
- pcpeasy_pmda_not_ready_error = rb_define_class_under(pcpeasy_class, "PMDANotReadyError", pcpeasy_error);
212
- pcpeasy_nyi_error = rb_define_class_under(pcpeasy_class, "NYIError", pcpeasy_error);
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
  }
@@ -21,7 +21,7 @@
21
21
 
22
22
  #include <ruby.h>
23
23
  extern VALUE pcpeasy_error;
24
- void pcpeasy_exceptions_init(VALUE pcpeasy_class);
24
+ void pcpeasy_exceptions_init(VALUE rb_cPCPEasy);
25
25
  void pcpeasy_raise_from_pmapi_error(int error_number);
26
26
 
27
27
  #endif
@@ -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 6
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 value, VALUE instance, VALUE semantics, VALUE type, VALUE units) {
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, "@value", value);
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("@value", self, other))
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
- VALUE pcpeasy_metric_new(char *metric_name, char *instance, pmValue *pm_value, pmDesc *pm_desc, int value_format) {
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] = value(value_format, pm_value, pm_desc->type);
237
- args[2] = instance_name(instance);
238
- args[3] = semantics_symbol(pm_desc->sem);
239
- args[4] = type(pm_desc->type);
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 pcpeasy_class) {
246
- pcpeasy_metric_class = rb_define_class_under(pcpeasy_class, "Metric", rb_cObject);
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, "value", READ_ONLY);
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);
@@ -22,7 +22,7 @@
22
22
  #include <ruby.h>
23
23
  #include <pcp/pmapi.h>
24
24
 
25
- void pcpeasy_metric_init(VALUE pcpeasy_class);
26
- VALUE pcpeasy_metric_new(char *metric_name, char *instance, pmValue *pm_value, pmDesc *pm_desc, int value_format);
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.2.1
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-03-31 00:00:00.000000000 Z
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: