/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.chukwa.extraction.demux.processor.mapper;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.chukwa.extraction.engine.ChukwaRecord;
import org.apache.hadoop.chukwa.extraction.engine.ChukwaRecordKey;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
import org.apache.log4j.Logger;
public class Iostat extends AbstractProcessor {
static Logger log = Logger.getLogger(Iostat.class);
public final String recordType = this.getClass().getName();
private static String regex = "([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}) (.*?) (.*?): (.*?) \\((.*?)\\)";
private static Pattern p = null;
private Matcher matcher = null;
private SimpleDateFormat sdf = null;
public Iostat() {
// TODO move that to config
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
p = Pattern.compile(regex);
}
@Override
protected void parse(String recordEntry,
OutputCollector<ChukwaRecordKey, ChukwaRecord> output, Reporter reporter)
throws Throwable {
log.debug("Iostat record: [" + recordEntry + "] type["
+ chunk.getDataType() + "]");
int i = 0;
matcher = p.matcher(recordEntry);
while (matcher.find()) {
log.debug("Iostat Processor Matches");
try {
Date d = sdf.parse(matcher.group(1).trim());
String[] lines = recordEntry.split("\n");
String[] headers = null;
for (int skip = 0; skip < 2; skip++) {
i++;
while (i < lines.length && lines[i].indexOf("avg-cpu") < 0) {
// Skip the first output because the numbers are averaged from
// system boot up
log.debug("skip line:" + lines[i]);
i++;
}
}
while (i < lines.length) {
ChukwaRecord record = null;
if (lines[i].indexOf("avg-cpu") >= 0
|| lines[i].indexOf("Device") >= 0) {
headers = parseHeader(lines[i]);
i++;
}
String data[] = parseData(lines[i]);
if (headers[0].equals("avg-cpu:")) {
log.debug("Matched CPU-Utilization");
record = new ChukwaRecord();
key = new ChukwaRecordKey();
buildGenericRecord(record, null, d.getTime(), "SystemMetrics");
} else if (headers[0].equals("Device:")) {
log.debug("Matched Iostat");
record = new ChukwaRecord();
key = new ChukwaRecordKey();
buildGenericRecord(record, null, d.getTime(), "SystemMetrics");
} else {
log.debug("No match:" + headers[0]);
}
if (record != null) {
int j = 0;
log.debug("Data Length: " + data.length);
while (j < data.length) {
log.debug("header:" + headers[j] + " data:" + data[j]);
if (!headers[j].equals("avg-cpu:")) {
try {
// Filter out overflow values for older linux systems
long x=Long.parseLong(data[j]);
if(x<100000000000L) {
record.add(headers[j],data[j]);
}
} catch(NumberFormatException ex) {
record.add(headers[j],data[j]);
}
}
j++;
}
record.setTime(d.getTime());
if (data.length > 3) {
output.collect(key, record);
}
}
i++;
}
// End of parsing
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
public String[] parseHeader(String header) {
String[] headers = header.split("\\s+");
return headers;
}
public String[] parseData(String dataLine) {
String[] data = dataLine.split("\\s+");
return data;
}
public String getDataType() {
return recordType;
}
}