#
#   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.
#
# syntax: [prefix].[source|sink].[instance].[options]
# See javadoc of package-info.java for org.apache.hadoop.metrics2 for details

# syntax: [prefix].[source|sink].[instance].[options]
# See javadoc of package-info.java for org.apache.hadoop.metrics2 for details

# default sampling period, in seconds
*.period=30
#*.periodMillis=100

####### File Sink >>>>>> CONF
# prefix=* && context=*
#*.sink.file.class=org.apache.hadoop.metrics2.sink.FileSink
#*.sink.file.filename=${ranger.admin.log.dir}/${ranger.admin.metrics.file}-all-metrics.out

# prefix=ranger && context=*
#ranger.sink.file.filename=${ranger.admin.log.dir}/${ranger.admin.metrics.file}-metrics.out

# prefix=ranger && context=admin
#ranger.sink.file_auth.class=org.apache.hadoop.metrics2.sink.FileSink
#ranger.sink.file_auth.context=admin
#rangar.sink.file_auth.filename=${ranger.admin.log.dir}/${ranger.admin.metrics.file}-metrics.out

####### Graphite Sink >>>>>> CONF
## prefix=* && context=*
#*.sink.graphite.class=org.apache.hadoop.metrics2.sink.GraphiteSink
#*.sink.graphite.server_host=127.0.0.1
#*.sink.graphite.server_port=2003
#*.sink.graphite.metrics_prefix=ranger

## prefix=raz && context=auth
#raz.sink.graphite_razcntx.class=org.apache.hadoop.metrics2.sink.GraphiteSink
#raz.sink.graphite_razcntx.server_host=127.0.0.1
#raz.sink.graphite_razcntx.server_port=2003
#raz.sink.graphite_razcntx.metrics_prefix=ranger
#raz.sink.graphite_razcntx.context=admin
####### Graphite Sink <<<<<< CONF

