FileContext.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /*
  2.  * FileContext.java
  3.  *
  4.  * Licensed to the Apache Software Foundation (ASF) under one
  5.  * or more contributor license agreements.  See the NOTICE file
  6.  * distributed with this work for additional information
  7.  * regarding copyright ownership.  The ASF licenses this file
  8.  * to you under the Apache License, Version 2.0 (the
  9.  * "License"); you may not use this file except in compliance
  10.  * with the License.  You may obtain a copy of the License at
  11.  *
  12.  *     http://www.apache.org/licenses/LICENSE-2.0
  13.  *
  14.  * Unless required by applicable law or agreed to in writing, software
  15.  * distributed under the License is distributed on an "AS IS" BASIS,
  16.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17.  * See the License for the specific language governing permissions and
  18.  * limitations under the License.
  19.  */
  20. package org.apache.hadoop.metrics.file;
  21. import java.io.BufferedOutputStream;
  22. import java.io.File;
  23. import java.io.FileWriter;
  24. import java.io.IOException;
  25. import java.io.PrintWriter;
  26. import org.apache.hadoop.metrics.ContextFactory;
  27. import org.apache.hadoop.metrics.MetricsException;
  28. import org.apache.hadoop.metrics.spi.AbstractMetricsContext;
  29. import org.apache.hadoop.metrics.spi.OutputRecord;
  30. /**
  31.  * Metrics context for writing metrics to a file.<p/>
  32.  *
  33.  * This class is configured by setting ContextFactory attributes which in turn
  34.  * are usually configured through a properties file.  All the attributes are
  35.  * prefixed by the contextName. For example, the properties file might contain:
  36.  * <pre>
  37.  * myContextName.fileName=/tmp/metrics.log
  38.  * myContextName.period=5
  39.  * </pre>
  40.  */
  41. public class FileContext extends AbstractMetricsContext {
  42.     
  43.   /* Configuration attribute names */
  44.   protected static final String FILE_NAME_PROPERTY = "fileName";
  45.   protected static final String PERIOD_PROPERTY = "period";
  46.     
  47.   private File file = null;              // file for metrics to be written to
  48.   private PrintWriter writer = null;
  49.     
  50.   /** Creates a new instance of FileContext */
  51.   public FileContext() {}
  52.     
  53.   public void init(String contextName, ContextFactory factory) {
  54.     super.init(contextName, factory);
  55.         
  56.     String fileName = getAttribute(FILE_NAME_PROPERTY);
  57.     if (fileName != null) {
  58.       file = new File(fileName);
  59.     }
  60.         
  61.     String periodStr = getAttribute(PERIOD_PROPERTY);
  62.     if (periodStr != null) {
  63.       int period = 0;
  64.       try {
  65.         period = Integer.parseInt(periodStr);
  66.       } catch (NumberFormatException nfe) {
  67.       }
  68.       if (period <= 0) {
  69.         throw new MetricsException("Invalid period: " + periodStr);
  70.       }
  71.       setPeriod(period);
  72.     }
  73.   }
  74.   /**
  75.    * Returns the configured file name, or null.
  76.    */
  77.   public String getFileName() {
  78.     if (file == null) {
  79.       return null;
  80.     } else {
  81.       return file.getName();
  82.     }
  83.   }
  84.     
  85.   /**
  86.    * Starts or restarts monitoring, by opening in append-mode, the
  87.    * file specified by the <code>fileName</code> attribute,
  88.    * if specified. Otherwise the data will be written to standard
  89.    * output.
  90.    */
  91.   public void startMonitoring()
  92.     throws IOException 
  93.   {
  94.     if (file == null) {
  95.       writer = new PrintWriter(new BufferedOutputStream(System.out));
  96.     } else {
  97.       writer = new PrintWriter(new FileWriter(file, true));
  98.     }
  99.     super.startMonitoring();
  100.   }
  101.     
  102.   /**
  103.    * Stops monitoring, closing the file.
  104.    * @see #close()
  105.    */
  106.   public void stopMonitoring() {
  107.     super.stopMonitoring();
  108.         
  109.     if (writer != null) {
  110.       writer.close();
  111.       writer = null;
  112.     }
  113.   }
  114.     
  115.   /**
  116.    * Emits a metrics record to a file.
  117.    */
  118.   public void emitRecord(String contextName, String recordName, OutputRecord outRec) {
  119.     writer.print(contextName);
  120.     writer.print(".");
  121.     writer.print(recordName);
  122.     String separator = ": ";
  123.     for (String tagName : outRec.getTagNames()) {
  124.       writer.print(separator);
  125.       separator = ", ";
  126.       writer.print(tagName);
  127.       writer.print("=");
  128.       writer.print(outRec.getTag(tagName));
  129.     }
  130.     for (String metricName : outRec.getMetricNames()) {
  131.       writer.print(separator);
  132.       separator = ", ";
  133.       writer.print(metricName);
  134.       writer.print("=");
  135.       writer.print(outRec.getMetric(metricName));
  136.     }
  137.     writer.println();
  138.   }
  139.     
  140.   /**
  141.    * Flushes the output writer, forcing updates to disk.
  142.    */
  143.   public void flush() {
  144.     writer.flush();
  145.   }
  146. }