#
# 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.
#

# Poll collectors every thirty seconds
*.period=30

#
# MetricSink configuration
# 
# Uncomment a sink (and configuration) to enable it. By default,
# no sinks are enabled.
#

#
# Configure file logging
#

# File sink for all metrics
# accumulo.sink.file-all.class=org.apache.hadoop.metrics2.sink.FileSink
# accumulo.sink.file-all.filename=all.metrics

# File sink for tserver metrics
# accumulo.sink.file-tserver.class=org.apache.hadoop.metrics2.sink.FileSink
# accumulo.sink.file-tserver.context=tserver
# accumulo.sink.file-tserver.filename=tserver.metrics

# File sink for manager metrics
# accumulo.sink.file-manager.class=org.apache.hadoop.metrics2.sink.FileSink
# accumulo.sink.file-manager.context=manager
# accumulo.sink.file-manager.filename=manager.metrics

# File sink for thrift server metrics
# accumulo.sink.file-thrift.class=org.apache.hadoop.metrics2.sink.FileSink
# accumulo.sink.file-thrift.context=thrift
# accumulo.sink.file-thrift.filename=thrift.metrics

# File sink for gc metrics
# accumulo.sink.file-gc.class=org.apache.hadoop.metrics2.sink.FileSink
# accumulo.sink.file-gc.context=accgc
# accumulo.sink.file-gc.filename=accgc.metrics

#
# Configure Graphite
#

# Configure all sources to be written to a Graphite instance
# accumulo.sink.graphite.class=org.apache.hadoop.metrics2.sink.GraphiteSink
# accumulo.sink.graphite.server_host=localhost
# accumulo.sink.graphite.server_port=2003

#
# Configure Ganglia
#

# for Ganglia 3.0 support
# accumulo.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink30

# for Ganglia 3.1 support
# accumulo.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31

# accumulo.sink.ganglia.period=10

# default for supportsparse is false
# accumulo.sink.ganglia.supportsparse=true

# accumulo.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both
# accumulo.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40

# Tag values to use for the ganglia prefix. If not defined no tags are used.
# If '*' all tags are used. If specifying multiple tags separate them with
# commas. Note that the last segment of the property name is the context name.
#
# accumulo.sink.ganglia.tagsForPrefix.jvm=ProcesName
# accumulo.sink.ganglia.tagsForPrefix.tserver=
# accumulo.sink.ganglia.tagsForPrefix.manager=
# accumulo.sink.ganglia.tagsForPrefix.thrift=

# Ganglia host(s)
# accumulo.sink.ganglia.servers=yourgangliahost_1:8649,yourgangliahost_2:8649
