<?xml version="1.0"?>
<!--
   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.
-->
<?xml-stylesheet type="text/xsl"  href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

  <property>
    <name>chukwaCollector.writerClass</name>
    <value>org.apache.hadoop.chukwa.datacollection.writer.PipelineStageWriter</value>
  </property>

  <!-- Sequence File Writer parameters
  <property>
    <name>chukwaCollector.pipeline</name>
    <value>org.apache.hadoop.chukwa.datacollection.writer.SocketTeeWriter,org.apache.hadoop.chukwa.datacollection.writer.SeqFileWriter</value>
  </property>
  -->

  <!-- LocalWriter parameters
  <property>
    <name>chukwaCollector.localOutputDir</name>
    <value>${TODO_COLLECTORS_LOCAL_OUTPUT_DIR}</value>
    <description>Chukwa local data sink directory, see LocalWriter.java</description>
  </property>

  <property>
    <name>chukwaCollector.writerClass</name>
    <value>org.apache.hadoop.chukwa.datacollection.writer.localfs.LocalWriter</value>
    <description>Local chukwa writer, see LocalWriter.java</description>
  </property>
  -->

  <!-- When writing to HBase, uncomment the following parameters. If you're running
  HBase in distributed mode, you'll also need to copy your hbase-site.xml file with
  your hbase.zookeeper.quorum setting to the conf/ dir. -->
  <!-- HBaseWriter parameters -->
  <property>
    <name>chukwaCollector.pipeline</name>
    <value>org.apache.hadoop.chukwa.datacollection.writer.SocketTeeWriter,org.apache.hadoop.chukwa.datacollection.writer.hbase.HBaseWriter</value>
  </property>

  <property>
    <name>hbase.demux.package</name>
    <value>org.apache.hadoop.chukwa.extraction.demux.processor</value>
    <description>Demux parser class package, HBaseWriter uses this package name to validate HBase for annotated demux parser classes.</description>
  </property>

  <property>
    <name>hbase.writer.verify.schema</name>
    <value>false</value>
    <description>Verify HBase Table schema with demux parser schema, log
    warning if there are mismatch between hbase schema and demux parsers.
    </description>
  </property>

  <property>
    <name>hbase.writer.halt.on.schema.mismatch</name>
    <value>false</value>
    <description>If this option is set to true, and HBase table schema 
    is mismatched with demux parser, collector will shut down itself.
    </description>
  </property>

  <!-- End of HBaseWriter parameters -->

  <property>
    <name>writer.hdfs.filesystem</name>
    <value>${TODO_COLLECTORS_NAMENODE}</value>
    <description>HDFS to dump to</description>
  </property>
  
  <property>
    <name>chukwaCollector.outputDir</name>
    <value>/chukwa/logs/</value>
    <description>Chukwa data sink directory</description>
  </property>

  <property>
    <name>chukwaCollector.rotateInterval</name>
    <value>${TODO_COLLECTORS_ROTATEINTERVAL}</value>
    <description>Chukwa rotate interval (ms)</description>
  </property>

  <property>
    <name>chukwaCollector.isFixedTimeRotatorScheme</name>
    <value>${TODO_COLLECTORS_ISFIXEDTIMEROTATORSCHEME}</value>
    <description>A flag to indicate that the collector should close at a fixed
    offset after every rotateInterval. The default value is false which uses
    the default scheme where collectors close after regular rotateIntervals.
    If set to true then specify chukwaCollector.fixedTimeIntervalOffset value.
    e.g., if isFixedTimeRotatorScheme is true and fixedTimeIntervalOffset is
    set to 10000 and rotateInterval is set to 300000, then the collector will
    close its files at 10 seconds past the 5 minute mark, if
    isFixedTimeRotatorScheme is false, collectors will rotate approximately
    once every 5 minutes
    </description>
  </property>

  <property>
    <name>chukwaCollector.fixedTimeIntervalOffset</name>
    <value>${TODO_COLLECTORS_FIXEDTIMEINTERVALOFFSET}</value>
    <description>Chukwa fixed time interval offset value (ms)</description>
  </property>

  <property>
    <name>chukwaCollector.http.port</name>
    <value>${TODO_COLLECTORS_PORT}</value>
    <description>The HTTP port number the collector will listen on</description>
  </property>

</configuration>
