blob: e114b25a3633277b0a74e312c708aefed4d375a2 [file] [log] [blame]
/*
* FileContext.java
*
* 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.metrics.file;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.metrics.ContextFactory;
import org.apache.hadoop.metrics.spi.AbstractMetricsContext;
import org.apache.hadoop.metrics.spi.OutputRecord;
/**
* Metrics context for writing metrics to a file.<p/>
*
* This class is configured by setting ContextFactory attributes which in turn
* are usually configured through a properties file. All the attributes are
* prefixed by the contextName. For example, the properties file might contain:
* <pre>
* myContextName.fileName=/tmp/metrics.log
* myContextName.period=5
* </pre>
*/
@InterfaceAudience.Public
@InterfaceStability.Evolving
public class FileContext extends AbstractMetricsContext {
/* Configuration attribute names */
@InterfaceAudience.Private
protected static final String FILE_NAME_PROPERTY = "fileName";
@InterfaceAudience.Private
protected static final String PERIOD_PROPERTY = "period";
private File file = null; // file for metrics to be written to
private PrintWriter writer = null;
/** Creates a new instance of FileContext */
@InterfaceAudience.Private
public FileContext() {}
@InterfaceAudience.Private
public void init(String contextName, ContextFactory factory) {
super.init(contextName, factory);
String fileName = getAttribute(FILE_NAME_PROPERTY);
if (fileName != null) {
file = new File(fileName);
}
parseAndSetPeriod(PERIOD_PROPERTY);
}
/**
* Returns the configured file name, or null.
*/
@InterfaceAudience.Private
public String getFileName() {
if (file == null) {
return null;
} else {
return file.getName();
}
}
/**
* Starts or restarts monitoring, by opening in append-mode, the
* file specified by the <code>fileName</code> attribute,
* if specified. Otherwise the data will be written to standard
* output.
*/
@InterfaceAudience.Private
public void startMonitoring()
throws IOException
{
if (file == null) {
writer = new PrintWriter(new BufferedOutputStream(System.out));
} else {
writer = new PrintWriter(new FileWriter(file, true));
}
super.startMonitoring();
}
/**
* Stops monitoring, closing the file.
* @see #close()
*/
@InterfaceAudience.Private
public void stopMonitoring() {
super.stopMonitoring();
if (writer != null) {
writer.close();
writer = null;
}
}
/**
* Emits a metrics record to a file.
*/
@InterfaceAudience.Private
public void emitRecord(String contextName, String recordName, OutputRecord outRec) {
writer.print(contextName);
writer.print(".");
writer.print(recordName);
String separator = ": ";
for (String tagName : outRec.getTagNames()) {
writer.print(separator);
separator = ", ";
writer.print(tagName);
writer.print("=");
writer.print(outRec.getTag(tagName));
}
for (String metricName : outRec.getMetricNames()) {
writer.print(separator);
separator = ", ";
writer.print(metricName);
writer.print("=");
writer.print(outRec.getMetric(metricName));
}
writer.println();
}
/**
* Flushes the output writer, forcing updates to disk.
*/
@InterfaceAudience.Private
public void flush() {
writer.flush();
}
}