31
31
import org .elasticsearch .common .xcontent .XContentBuilderString ;
32
32
33
33
import java .io .IOException ;
34
+ import java .util .HashSet ;
34
35
import java .util .Iterator ;
36
+ import java .util .Set ;
35
37
36
38
/**
37
39
*/
38
40
public class FsStats implements Iterable <FsStats .Info >, Streamable , ToXContent {
39
41
40
- public static class Info implements Streamable {
42
+ public static class Info implements Streamable , ToXContent {
41
43
42
44
String path ;
43
45
@ Nullable
@@ -142,9 +144,136 @@ public double getDiskServiceTime() {
142
144
return diskServiceTime ;
143
145
}
144
146
147
+ private long addLong (long current , long other ) {
148
+ if (other == -1 ) {
149
+ return current ;
150
+ }
151
+ if (current == -1 ) {
152
+ return other ;
153
+ }
154
+ return current + other ;
155
+ }
156
+
157
+ private double addDouble (double current , double other ) {
158
+ if (other == -1 ) {
159
+ return current ;
160
+ }
161
+ if (current == -1 ) {
162
+ return other ;
163
+ }
164
+ return current + other ;
165
+ }
166
+
167
+ public void add (Info info ) {
168
+ total = addLong (total , info .total );
169
+ free = addLong (free , info .free );
170
+ available = addLong (available , info .available );
171
+ diskReads = addLong (diskReads , info .diskReads );
172
+ diskWrites = addLong (diskWrites , info .diskWrites );
173
+ diskReadBytes = addLong (diskReadBytes , info .diskReadBytes );
174
+ diskWriteBytes = addLong (diskWriteBytes , info .diskWriteBytes );
175
+ diskQueue = addDouble (diskQueue , info .diskQueue );
176
+ diskServiceTime = addDouble (diskServiceTime , info .diskServiceTime );
177
+ }
178
+
179
+ static final class Fields {
180
+ static final XContentBuilderString PATH = new XContentBuilderString ("path" );
181
+ static final XContentBuilderString MOUNT = new XContentBuilderString ("mount" );
182
+ static final XContentBuilderString DEV = new XContentBuilderString ("dev" );
183
+ static final XContentBuilderString TOTAL = new XContentBuilderString ("total" );
184
+ static final XContentBuilderString TOTAL_IN_BYTES = new XContentBuilderString ("total_in_bytes" );
185
+ static final XContentBuilderString FREE = new XContentBuilderString ("free" );
186
+ static final XContentBuilderString FREE_IN_BYTES = new XContentBuilderString ("free_in_bytes" );
187
+ static final XContentBuilderString AVAILABLE = new XContentBuilderString ("available" );
188
+ static final XContentBuilderString AVAILABLE_IN_BYTES = new XContentBuilderString ("available_in_bytes" );
189
+ static final XContentBuilderString DISK_READS = new XContentBuilderString ("disk_reads" );
190
+ static final XContentBuilderString DISK_WRITES = new XContentBuilderString ("disk_writes" );
191
+ static final XContentBuilderString DISK_IO_OP = new XContentBuilderString ("disk_io_op" );
192
+ static final XContentBuilderString DISK_READ_SIZE = new XContentBuilderString ("disk_read_size" );
193
+ static final XContentBuilderString DISK_READ_SIZE_IN_BYTES = new XContentBuilderString ("disk_read_size_in_bytes" );
194
+ static final XContentBuilderString DISK_WRITE_SIZE = new XContentBuilderString ("disk_write_size" );
195
+ static final XContentBuilderString DISK_WRITE_SIZE_IN_BYTES = new XContentBuilderString ("disk_write_size_in_bytes" );
196
+ static final XContentBuilderString DISK_IO_SIZE = new XContentBuilderString ("disk_io_size" );
197
+ static final XContentBuilderString DISK_IO_IN_BYTES = new XContentBuilderString ("disk_io_size_in_bytes" );
198
+ static final XContentBuilderString DISK_QUEUE = new XContentBuilderString ("disk_queue" );
199
+ static final XContentBuilderString DISK_SERVICE_TIME = new XContentBuilderString ("disk_service_time" );
200
+ }
201
+
202
+ @ Override
203
+ public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
204
+ builder .startObject ();
205
+ if (path != null ) {
206
+ builder .field (Fields .PATH , path , XContentBuilder .FieldCaseConversion .NONE );
207
+ }
208
+ if (mount != null ) {
209
+ builder .field (Fields .MOUNT , mount , XContentBuilder .FieldCaseConversion .NONE );
210
+ }
211
+ if (dev != null ) {
212
+ builder .field (Fields .DEV , dev , XContentBuilder .FieldCaseConversion .NONE );
213
+ }
214
+
215
+ if (total != -1 ) {
216
+ builder .byteSizeField (Fields .TOTAL_IN_BYTES , Fields .TOTAL , total );
217
+ }
218
+ if (free != -1 ) {
219
+ builder .byteSizeField (Fields .FREE_IN_BYTES , Fields .FREE , free );
220
+ }
221
+ if (available != -1 ) {
222
+ builder .byteSizeField (Fields .AVAILABLE_IN_BYTES , Fields .AVAILABLE , available );
223
+ }
224
+
225
+ long iop = -1 ;
226
+
227
+ if (diskReads != -1 ) {
228
+ iop = diskReads ;
229
+ builder .field (Fields .DISK_READS , diskReads );
230
+ }
231
+ if (diskWrites != -1 ) {
232
+ if (iop != -1 ) {
233
+ iop += diskWrites ;
234
+ } else {
235
+ iop = diskWrites ;
236
+ }
237
+ builder .field (Fields .DISK_WRITES , diskWrites );
238
+ }
239
+
240
+ if (iop != -1 ) {
241
+ builder .field (Fields .DISK_IO_OP , iop );
242
+ }
243
+
244
+ long ioBytes = -1 ;
245
+
246
+ if (diskReadBytes != -1 ) {
247
+ ioBytes = diskReadBytes ;
248
+ builder .byteSizeField (Fields .DISK_READ_SIZE_IN_BYTES , Fields .DISK_READ_SIZE , diskReadBytes );
249
+ }
250
+ if (diskWriteBytes != -1 ) {
251
+ if (ioBytes != -1 ) {
252
+ ioBytes += diskWriteBytes ;
253
+ } else {
254
+ ioBytes = diskWriteBytes ;
255
+ }
256
+ builder .byteSizeField (Fields .DISK_WRITE_SIZE_IN_BYTES , Fields .DISK_WRITE_SIZE , diskWriteBytes );
257
+ }
258
+
259
+ if (ioBytes != -1 ) {
260
+ builder .byteSizeField (Fields .DISK_IO_IN_BYTES , Fields .DISK_IO_SIZE , ioBytes );
261
+ }
262
+
263
+ if (diskQueue != -1 ) {
264
+ builder .field (Fields .DISK_QUEUE , Strings .format1Decimals (diskQueue , "" ));
265
+ }
266
+ if (diskServiceTime != -1 ) {
267
+ builder .field (Fields .DISK_SERVICE_TIME , Strings .format1Decimals (diskServiceTime , "" ));
268
+ }
269
+
270
+ builder .endObject ();
271
+ return builder ;
272
+ }
145
273
}
146
274
147
275
long timestamp ;
276
+ Info total ;
148
277
Info [] infos ;
149
278
150
279
FsStats () {
@@ -154,6 +283,25 @@ public double getDiskServiceTime() {
154
283
FsStats (long timestamp , Info [] infos ) {
155
284
this .timestamp = timestamp ;
156
285
this .infos = infos ;
286
+ this .total = null ;
287
+ }
288
+
289
+ public Info total () {
290
+ if (total != null ) {
291
+ return total ;
292
+ }
293
+ Info res = new Info ();
294
+ Set <String > seenDevices = new HashSet <String >(infos .length );
295
+ for (Info subInfo : infos ) {
296
+ if (subInfo .dev != null ) {
297
+ if (!seenDevices .add (subInfo .dev )) {
298
+ continue ; // already added numbers for this device;
299
+ }
300
+ }
301
+ res .add (subInfo );
302
+ }
303
+ total = res ;
304
+ return res ;
157
305
}
158
306
159
307
public long getTimestamp () {
@@ -194,72 +342,18 @@ static final class Fields {
194
342
static final XContentBuilderString FS = new XContentBuilderString ("fs" );
195
343
static final XContentBuilderString TIMESTAMP = new XContentBuilderString ("timestamp" );
196
344
static final XContentBuilderString DATA = new XContentBuilderString ("data" );
197
- static final XContentBuilderString PATH = new XContentBuilderString ("path" );
198
- static final XContentBuilderString MOUNT = new XContentBuilderString ("mount" );
199
- static final XContentBuilderString DEV = new XContentBuilderString ("dev" );
200
345
static final XContentBuilderString TOTAL = new XContentBuilderString ("total" );
201
- static final XContentBuilderString TOTAL_IN_BYTES = new XContentBuilderString ("total_in_bytes" );
202
- static final XContentBuilderString FREE = new XContentBuilderString ("free" );
203
- static final XContentBuilderString FREE_IN_BYTES = new XContentBuilderString ("free_in_bytes" );
204
- static final XContentBuilderString AVAILABLE = new XContentBuilderString ("available" );
205
- static final XContentBuilderString AVAILABLE_IN_BYTES = new XContentBuilderString ("available_in_bytes" );
206
- static final XContentBuilderString DISK_READS = new XContentBuilderString ("disk_reads" );
207
- static final XContentBuilderString DISK_WRITES = new XContentBuilderString ("disk_writes" );
208
- static final XContentBuilderString DISK_READ_SIZE = new XContentBuilderString ("disk_read_size" );
209
- static final XContentBuilderString DISK_READ_SIZE_IN_BYTES = new XContentBuilderString ("disk_read_size_in_bytes" );
210
- static final XContentBuilderString DISK_WRITE_SIZE = new XContentBuilderString ("disk_write_size" );
211
- static final XContentBuilderString DISK_WRITE_SIZE_IN_BYTES = new XContentBuilderString ("disk_write_size_in_bytes" );
212
- static final XContentBuilderString DISK_QUEUE = new XContentBuilderString ("disk_queue" );
213
- static final XContentBuilderString DISK_SERVICE_TIME = new XContentBuilderString ("disk_service_time" );
214
346
}
215
347
216
348
@ Override
217
349
public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
218
350
builder .startObject (Fields .FS );
219
351
builder .field (Fields .TIMESTAMP , timestamp );
352
+ builder .field (Fields .TOTAL );
353
+ total ().toXContent (builder , params );
220
354
builder .startArray (Fields .DATA );
221
355
for (Info info : infos ) {
222
- builder .startObject ();
223
- builder .field (Fields .PATH , info .path , XContentBuilder .FieldCaseConversion .NONE );
224
- if (info .mount != null ) {
225
- builder .field (Fields .MOUNT , info .mount , XContentBuilder .FieldCaseConversion .NONE );
226
- }
227
- if (info .dev != null ) {
228
- builder .field (Fields .DEV , info .dev , XContentBuilder .FieldCaseConversion .NONE );
229
- }
230
-
231
- if (info .total != -1 ) {
232
- builder .byteSizeField (Fields .TOTAL_IN_BYTES , Fields .TOTAL , info .total );
233
- }
234
- if (info .free != -1 ) {
235
- builder .byteSizeField (Fields .FREE_IN_BYTES , Fields .FREE , info .free );
236
- }
237
- if (info .available != -1 ) {
238
- builder .byteSizeField (Fields .AVAILABLE_IN_BYTES , Fields .AVAILABLE , info .available );
239
- }
240
-
241
- if (info .diskReads != -1 ) {
242
- builder .field (Fields .DISK_READS , info .diskReads );
243
- }
244
- if (info .diskWrites != -1 ) {
245
- builder .field (Fields .DISK_WRITES , info .diskWrites );
246
- }
247
-
248
- if (info .diskReadBytes != -1 ) {
249
- builder .byteSizeField (Fields .DISK_READ_SIZE_IN_BYTES , Fields .DISK_READ_SIZE , info .getDiskReadSizeInBytes ());
250
- }
251
- if (info .diskWriteBytes != -1 ) {
252
- builder .byteSizeField (Fields .DISK_WRITE_SIZE_IN_BYTES , Fields .DISK_WRITE_SIZE , info .getDiskWriteSizeInBytes ());
253
- }
254
-
255
- if (info .diskQueue != -1 ) {
256
- builder .field (Fields .DISK_QUEUE , Strings .format1Decimals (info .diskQueue , "" ));
257
- }
258
- if (info .diskServiceTime != -1 ) {
259
- builder .field (Fields .DISK_SERVICE_TIME , Strings .format1Decimals (info .diskServiceTime , "" ));
260
- }
261
-
262
- builder .endObject ();
356
+ info .toXContent (builder , params );
263
357
}
264
358
builder .endArray ();
265
359
builder .endObject ();
0 commit comments