//
// Licensed 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.
//

=== Collectors

Decanter collectors harvest the monitoring data, and send this data to the Decanter appenders.

Two kinds of collector are available:

* Event Driven Collectors react to events and "broadcast" the data to the appenders.
* Polled Collectors are periodically executed by the Decanter Scheduler. When executed, the collectors harvest the
data and send to the appenders.

==== Log

The Decanter Log Collector is an event driven collector. It automatically reacts when a log occurs, and
sends the log details (level, logger name, message, etc) to the appenders.

The `decanter-collector-log` feature installs the log collector:

----
karaf@root()> feature:install decanter-collector-log
----

The log collector doesn't need any configuration, the installation of the decanter-collector-log feature is enough.

[NOTE]
=====================================================================
The Decanter log collector is using `osgi:DecanterLogCollectorAppender` appender.
In order to work, your Apache Karaf Pax Logging configuration should contain this appender.

The default Apache Karaf `etc/org.ops4j.pax.logging.cfg` configuration file is already fine:

----
log4j.rootLogger = DEBUG, out, osgi:*
----

If you want, you can explicitly specify the `DecanterLogCollectorAppender` appender:

----
log4j.rootLogger = DEBUG, out, osgi:DecanterLogCollectorAppender, osgi:VmLogAppender
----

=====================================================================

==== CXF Logging feature integration

The link:http://cxf.apache.org/docs/message-logging.html[CXF message logging] nicely integrates with Decanter. Simply add the link:https://github.com/apache/cxf/blob/master/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java[org.apache.cxf.ext.logging.LoggingFeature] to your service.

This will automatically log the messages from all clients and endpoints to slf4j. All meta data can be found in the MDC attributes. The message logging can be switched on/off per service using the org.ops4j.pax.logging.cfg.

When using with Decanter make sure you enable the log collector to actually process the message logs.

==== Log Socket

The Decanter Log Socket Collector is an event driven collector. It creates a socket, waiting for incoming event. The expected
events are log4j LoggingEvent. The log4j LoggingEvent is transformed as a Map containing the log details (level, logger name, message, ...).
This Map is sent to the appenders.

The collector allows you to remotely use Decanter. For instance, you can have an application running on a different platform (spring-boot,
application servers, ...). This application can use a log4j socket appender that send the logging events to the Decanter
log socket collector.

The `decanter-collector-log-socket` feature install the log socket collector:

----
karaf@root()> feature:install decanter-collector-log-socket
----

This feature installs the collector and a default `etc/org.apache.karaf.decanter.collector.log.socket.cfg` configuration file
containing:

----
#
# Decanter Log/Log4j Socket collector configuration
#

#port=4560
#workers=10

----

* the `port` property defines the port number where the collector is bound and listen for incoming logging event. Default is 4560.
* the `workers` properties defines the number of threads (workers) which can deal with multiple clients in the same time.

==== File

The Decanter File Collector is an event driven collector. It automatically reacts when new lines are appended into
a file (especially a log file). It acts like the tail Unix command. Basically, it's an alternative to the log collector.
The log collector reacts to local Karaf log messages, whereas the file collector can react to any file, including log
files from other systems to Karaf. It means that you can monitor and send collected data for any system (even if it is not Java
based).

The file collector deals with file rotation, file not found.

The `decanter-collector-file` feature installs the file collector:

----
karaf@root()> feature:install decanter-collector-file
----

Now, you have to create a configuration file for each file that you want to monitor. In the etc folder, you have to
create a file with the following format name `etc/org.apache.karaf.decanter.collector.file-ID.cfg` where ID is an ID
of your choice.

This file contains:

----
type=my
path=/path/to/file
any=value
----

* `type` is an ID (mandatory) that allows you to easily identify the monitored file
* `path` is the location of the file that you want to monitor
* all other values (like `any`) will be part of the collected data. It means that you can add your own custom data, and
easily create queries bases on this data.

You can also filter the lines read from the file using the `regex` property.

For instance:

----
regex=(.*foo.*)
----

Only the line matching the `regex` will be sent to the dispatcher.

For instance, instead of the log collector, you can create the following `etc/org.apache.karaf.decanter.collector.file-karaf.cfg`
file collector configuration file:

----
type=karaf-log-file
path=/path/to/karaf/data/log/karaf.log
regex=(.*my.*)
my=stuff
----

The file collector will tail on `karaf.log` file, and send any new line matching the `regex` in this log file as collected data.

===== Parser

By default, the collector use the `org.apache.karaf.decanter.impl.parser.IdentityParser` parser to parse the line into
a typed Object (Long, Integer or String) before send it to the EventDispatcher data map.

====== Identity parser

The identity parser doesn't actually parse the line, it just passes through. It's the default parser used by the file collector.

====== Split parser

The split parser splits the line using a separator (`,` by default). Optionally, it can take `keys` used a property name in the event.

For instance, you can have the following `etc/org.apache.karaf.decanter.parser.split.cfg` configuration file:

----
separator=,
keys=first,second,third,fourth
----

If the parser gets a line (collected by the file collector) like `this,is,a,test`, the line will be parsed as follows (the file collector will send the following data to the dispatcher):

----
first->this
second->is
third->a
fourth->test
----

If the `keys` configuration is not set, then `key-0`, `key-1`, etc will be used.

To use this parser in the file collector, you have to define it in the `parser.target` configuration (in `etc/org.apache.karaf.decanter.collector.file-XXXX.cfg`):

----
parser.target=(parserId=split)
----

====== Regex parser

The regex parser is similar to the split parser but instead of using a separator, it uses regex groups.

The configuration contains the `regex` and the `keys` in the `etc/org.apache.karaf.decanter.parser.regex.cfg` configuration file:

----
regex=(t.*t)
----

If the parser gets a line (collected by the file collector) like `a test here`, the line will be parsed as follows (the file collector will send the following data to the dispatcher):

----
key-0->test
----

It's also possible to use `keys` to identify each regex group.

To use this parser in the file collector, you have to define it in the `parser.target` configuration (in `etc/org.apache.karaf.decanter.collector.file-XXXX.cfg`):

----
parser.target=(parserId=regex)
----

====== Custom parser

You can write your own parser by implementing the `org.apache.karaf.decanter.api.parser.Parser` interface and declare
it into the file collector configuration file:

----
parser.target=(parserId=myParser)
----

==== EventAdmin

The Decanter EventAdmin Collector is an event-driven collector, listening for all internal events happening in
the Apache Karaf Container.

[NOTE]
================================================
It's the perfect way to audit all actions performed on resources (features, bundles, configurations, ...) by users
(via local shell console, SSH, or JMX).

We recommend to use this collector to implement users and actions auditing.
================================================

The `decanter-collector-eventadmin` feature installs the eventadmin collector:

----
karaf@root()> feature:install decanter-collector-eventadmin
----

By default, the eventadmin collector is listening for all OSGi framework and Karaf internal events.

You can specify additional events to trap by providing a `etc/org.apache.karaf.decanter.collector.eventadmin-my.cfg' configuration
file, containing the EventAdmin topics you want to listen:

----
event.topics=my/*
----

[NOTE]
================================================
By default, the events contain timestamp and subject.
You can disable this by modifying `etc/org.apache.felix.eventadmin.impl.EventAdmin` configuration file:

----
org.apache.felix.eventadmin.AddTimestamp=true
org.apache.felix.eventadmin.AddSubject=true
----
================================================

==== JMX

The Decanter JMX Collector is a polled collector, executed periodically by the Decanter Scheduler.

The JMX collector connects to a JMX MBeanServer (local or remote), and retrieves all attributes of each available MBeans.
The JMX metrics (attribute values) are send to the appenders.

In addition, the JMX collector also supports the execution of operations on dedicated ObjectName that you configure via `cfg` file.

The `decanter-collector-jmx` feature installs the JMX collector, and a default configuration file:

----
karaf@root()> feature:install decanter-collector-jmx
----

This feature brings a `etc/org.apache.karaf.decanter.collector.jmx-local.cfg` configuration file containing:

----
#
# Decanter Local JMX collector configuration
#

# Name/type of the JMX collection
type=jmx-local

# URL of the JMX MBeanServer.
# local keyword means the local platform MBeanServer or you can specify to full JMX URL
# like service:jmx:rmi:///jndi/rmi://hostname:port/karaf-instance
url=local

# Username to connect to the JMX MBeanServer
#username=karaf

# Password to connect to the JMX MBeanServer
#password=karaf

# Object name filter to use. Instead of harvesting all MBeans, you can select only
# some MBeans matching the object name filter
#object.name=org.apache.camel:context=*,type=routes,name=*

# Several object names can also be specified.
# What matters is that the property names begin with "object.name".
#object.name.system=java.lang:*
#object.name.karaf=org.apache.karaf:type=http,name=*
#object.name.3=org.apache.activemq:*

# You can also execute operations on some MBeans, providing the object name, operation, arguments (separated by ,)
# and signatures (separated by ,) for the arguments (separated by |)
#operation.name.rootLogger=org.apache.karaf:type=log,name=root|getLevel|rootLogger|java.lang.String
----

This file harvests the data of the local MBeanServer:

* the `type` property is a name (of your choice) allowing you to easily identify the harvested data
* the `url` property is the MBeanServer to connect to. "local" is a reserved keyword to specify the local MBeanServer.
Instead of "local", you can use the JMX service URL. For instance, for Karaf version 3.0.0, 3.0.1, 3.0.2, and 3.0.3,
as the local MBeanServer is secured, you can specify `service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root`. You
can also polled any remote MBean server (Karaf based or not) providing the service URL.
* the `username` property contains the username to connect to the MBean server. It's only required if the MBean server
is secured.
* the `password` property contains the password to connect to the MBean server. It's only required if the MBean server
is secured.
* the `object.name` prefix is optional. If this property is not specified, the collector will retrieve the attributes
of all MBeans. You can filter to consider only some MBeans. This property contains the ObjectName filter to retrieve
the attributes only of some MBeans. Several object names can be listed, provided the property prefix is `object.name.`.
* any other values will be part of the collected data. It means that you can add your own property if you want to add
additional data, and create queries based on this data.
* the `operation.name` prefix is also optional. You can use it to execute an operation. The value format is `objectName|operation|arguments|signatures`.

You can retrieve multiple MBean servers. For that, you just create a new configuration file using the file name format
`etc/org.apache.karaf.decanter.collector.jmx-[ANYNAME].cfg`.

===== JMXMP

The Karaf Decanter JMX collector by default uses RMI protocol for JMX. But it also supports JMXMP protocol.

The features to install are the same: `decanter-collector-jmx`.

However, you have to enable the `jmxmp` protocol support in the Apache Karaf instance hosting Karaf Decanter.

You can download the `jmxmp` protocol provider artifact on Maven Central: [http://repo.maven.apache.org/maven2/org/glassfish/external/opendmk_jmxremote_optional_jar/1.0-b01-ea/opendmk_jmxremote_optional_jar-1.0-b01-ea.jar]

The `opendmk_jmxremote_optional_jar-1.0-b01-ea.jar` file has to be copied in the `lib/boot` folder of your Apache Karaf instance.

Then, you have to add the new JMX remote packages by editing `etc/config.properties`, appending the following to the `org.osgi.framework.system.packages.extra` property:

----
org.osgi.framework.system.packages.extra = \
    ...
    javax.remote, \
    com.sun.jmx, \
    com.sun.jmx.remote, \
    com.sun.jmx.remote.protocol, \
    com.sun.jmx.remote.generic, \
    com.sun.jmx.remote.opt, \
    com.sun.jmx.remote.opt.internal, \
    com.sun.jmx.remote.opt.security, \
    com.sun.jmx.remote.opt.util, \
    com.sun.jmx.remote.profile, \
    com.sun.jmx.remote.profile.sasl, \
    com.sun.jmx.remote.profile.tls, \
    com.sun.jmx.remote.socket, \
    javax.management, \
    javax.management.remote, \
    javax.management.remote.generic, \
    javax.management.remote.jmxmp, \
    javax.management.remote.message
----

Then, you can create a new Decanter JMX collector by creating a new file, like `etc/org.apache.karaf.decanter.collector.jmx-mycollector.cfg` containing something like:

----
type=jmx-mycollector
url=service:jmx:jmxmp://host:port
jmx.remote.protocol.provider.pkgs=com.sun.jmx.remote.protocol
----

You can see:
* the `url` property contains an URL with `jmxmp` instead of `rmi`.
* in order to support `jmxmp` protocol, you have to set the protocol provider via the `jmx.remote.protocol.provider.pkgs` property (by default, Karaf Decanter JMX collector uses the `rmi` protocol provider)

==== ActiveMQ (JMX)

The ActiveMQ JMX collector is just a special configuration of the JMX collector.

The `decanter-collector-activemq` feature installs the default JMX collector, with the specific ActiveMQ JMX configuration:

----
karaf@root()> feature:install decanter-collector-jmx-activemq
----

This feature installs the same collector as the `decanter-collector-jmx`, but also adds the
`etc/org.apache.karaf.decanter.collector.jmx-activemq.cfg` configuration file.

This file contains:

----
#
# Decanter Local ActiveMQ JMX collector configuration
#

# Name/type of the JMX collection
type=jmx-activemq

# URL of the JMX MBeanServer.
# local keyword means the local platform MBeanServer or you can specify to full JMX URL
# like service:jmx:rmi:///jndi/rmi://hostname:port/karaf-instance
url=local

# Username to connect to the JMX MBeanServer
#username=karaf

# Password to connect to the JMX MBeanServer
#password=karaf

# Object name filter to use. Instead of harvesting all MBeans, you can select only
# some MBeans matching the object name filter
object.name=org.apache.activemq:*
----

This configuration actually contains a filter to retrieve only the ActiveMQ JMX MBeans.

==== Camel (JMX)

The Camel JMX collector is just a special configuration of the JMX collector.

The `decanter-collector-jmx-camel` feature installs the default JMX collector, with the specific Camel JMX configuration:

----
karaf@root()> feature:install decanter-collector-jmx-camel
----

This feature installs the same collector as the `decanter-collector-jmx`, but also adds the
`etc/org.apache.karaf.decanter.collector.jmx-camel.cfg` configuration file.

This file contains:

----
#
# Decanter Local Camel JMX collector configuration
#

# Name/type of the JMX collection
type=jmx-camel

# URL of the JMX MBeanServer.
# local keyword means the local platform MBeanServer or you can specify to full JMX URL
# like service:jmx:rmi:///jndi/rmi://hostname:port/karaf-instance
url=local

# Username to connect to the JMX MBeanServer
#username=karaf

# Password to connect to the JMX MBeanServer
#password=karaf

# Object name filter to use. Instead of harvesting all MBeans, you can select only
# some MBeans matching the object name filter
object.name=org.apache.camel:context=*,type=routes,name=*
----

This configuration actually contains a filter to retrieve only the Camel Routes JMX MBeans.

==== Camel Tracer & Notifier

Decanter provides a Camel Tracer Handler that you can set on a Camel Tracer. It also provides a Camel Event Notifier.

===== Camel Tracer

If you enable the tracer on a Camel route, all tracer events (exchanges on each step of the route) are sent to the
appenders.

The `decanter-collector-camel` feature provides the Camel Tracer Handler:

----
karaf@root()> feature:install decanter-collector-camel
----

Now, you can use the Decanter Camel Tracer Handler in a tracer that you can use in routes.

For instance, the following route definition shows how to enable tracer on a route, and use the Decanter Tracer Handler
in the Camel Tracer:

----
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <reference id="dispatcher" interface="org.osgi.service.event.EventAdmin"/>

    <bean id="traceHandler" class="org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler">
        <property name="dispatcher" ref="dispatcher"/>
    </bean>

    <bean id="tracer" class="org.apache.camel.processor.interceptor.Tracer">
        <property name="traceHandler" ref="traceHandler"/>
        <property name="enabled" value="true"/>
        <property name="traceOutExchanges" value="true"/>
        <property name="logLevel" value="OFF"/>
    </bean>

    <camelContext trace="true" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="test">
            <from uri="timer:fire?period=10000"/>
            <setBody><constant>Hello World</constant></setBody>
            <to uri="log:test"/>
        </route>
    </camelContext>

</blueprint>
----

You can extend the Decanter event with any property using a custom `DecanterCamelEventExtender`:

----
public interface DecanterCamelEventExtender {

    void extend(Map<String, Object> decanterData, Exchange camelExchange);

}
----

You can inject your extender using `setExtender(myExtender)` on the `DecanterTraceEventHandler`. Decanter will automatically
call your extender to populate extra properties.

===== Camel Event Notifier

Decanter also provides `DecanterEventNotifier` implementing a Camel event notifier: http://camel.apache.org/eventnotifier-to-log-details-about-all-sent-exchanges.html

It's very similar to the Decanter Camel Tracer. You can control the camel contexts and routes to which you want to trap events.

==== System (oshi)

The oshi collector is a system collector (polled) that periodically retrieve all details about the hardware and the operating system.

This collector gets lot of details about the machine.

The `decanter-collector-oshi` feature installs the oshi system collector:

----
karaf@root()> feature:install decanter-collector-oshi
----

This feature installs a default `etc/org.apache.karaf.decanter.collector.oshi.cfg` configuration file containing:

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

#
# Decanter oshi (system) collector
#

# computerSystem=true
# computerSystem.baseboard=true
# computerSystem.firmware=true
# memory=true
# processors=true
# processors.logical=true
# displays=true
# disks=true
# disks.partitions=true
# graphicsCards=true
# networkIFs=true
# powerSources=true
# soundCards=true
# sensors=true
# usbDevices=true
# operatingSystem=true
# operatingSystem.fileSystems=true
# operatingSystem.networkParams=true
# operatingSystem.processes=true
# operatingSystem.services=true
----

By default, the oshi collector gets all details about the machine. You can filter what you want to harvest in this configuration file.

==== System (script)

The system collector is a polled collector (periodically executed by the Decanter Scheduler).

This collector executes operating system commands (or scripts) and send the execution output to the appenders.

The `decanter-collector-system` feature installs the system collector:

----
karaf@root()> feature:install decanter-collector-system
----

This feature installs a default `etc/org.apache.karaf.decanter.collector.system.cfg` configuration file containing:

----
#
# Decanter OperationSystem Collector configuration
#

# This collector executes system commands, retrieve the exec output/err
# sent to the appenders
#
# You can define the number of thread to use for parallelization command calls:
# thread.number=1
#
# The format is command.key=command_to_execute
# where command is a reserved keyword used to identify a command property
# for instance:
#
# command.df=df -h
# command.free=free
#
# You can also create a script containing command like:
#
#   df -k / | awk -F " |%" '/dev/{print $8}'
#
# This script will get the available space on the / filesystem for instance.
# and call the script:
#
# command.df=/bin/script
#
# Another example of script to get the temperature:
#
#   sensors|grep temp1|awk '{print $2}'|cut -b2,3,4,5
#
----

You can add the commands that you want to execute using the format:

----
command.name=system_command
----

The collector will execute each command described in this file, and send the execution output to the appenders.

For instance, if you want to periodically send the free space available on the / filesystem, you can add:

----
command.df=df -k / | awk -F " |%" '/dev/{print $8}'
----

==== Network socket

The Decanter network socket collector listens for incoming messages coming from a remote network socket collector.

The `decanter-collector-socket` feature installs the network socket collector:

----
karaf@root()> feature:install decanter-collector-socket
----

This feature installs a default `etc/org.apache.karaf.decanter.collector.socket.cfg` configuration file containing:

----
# Decanter Socket Collector

# Port number on which to listen
#port=34343

# Binding address on which to listen
#host=0.0.0.0

# Number of worker threads to deal with
#workers=10

# Protocol tcp(default) or udp
#protocol=tcp

# Unmarshaller to use
# Unmarshaller is identified by data format. The default is json, but you can use another unmarshaller
unmarshaller.target=(dataFormat=json)
----

* the `port` property contains the port number where the network socket collector is listening
* the `host` property contains the host name/interface address where the network socket collector is listening
* the `workers` property contains the number of worker threads the socket collector is using for the connection
* the `protocol` property contains the protocol used by the collector for transferring data with the client
* the `unmarshaller.target` property contains the unmarshaller used by the collector to transform the data
sent by the client.

==== JMS

The Decanter JMS collector consumes the data from a JMS queue or topic. It's a way to aggregate collected data coming
from (several) remote machines.

The `decanter-collector-jms` feature installs the JMS collector:

----
karaf@root()> feature:install decanter-collector-jms
----

This feature also installs a default `etc/org.apache.karaf.decanter.collector.jms.cfg` configuration file containing:

----
######################################
# Decanter JMS Collector Configuration
######################################

# Name of the JMS connection factory
connection.factory.name=jms/decanter

# Name of the destination
destination.name=decanter

# Type of the destination (queue or topic)
destination.type=queue

# Connection username
# username=

# Connection password
# password=
----

* the `connection.factory.name` is the name of the ConnectionFactory OSGi service to use
* the `destination.name` is the name of the queue or topic where to consume messages from the JMS broker
* the `destination.type` is the type of the destination (queue or topic)
* the `username` and `password` properties are the credentials to use with a secured connection factory

==== MQTT

The Decanter MQTT collector receives collected messages from a MQTT broker. It's a way to aggregate collected data coming
from (several) remote machines.

The `decanter-collector-mqtt` feature installs the MQTT collector:

----
karaf@root()> feature:install decanter-collector-mqtt
----

This feature also installs a default `etc/org.apache.karaf.decanter.collector.mqtt.cfg` configuration file containing:

----
#######################################
# Decanter MQTT Collector Configuration
#######################################

# URI of the MQTT broker
server.uri=tcp://localhost:61616

# MQTT Client ID
client.id=decanter

# MQTT topic name
topic=decanter
----

* the `server.uri` is the location of the MQTT broker
* the `client.id` is the Decanter MQTT client ID
* the `topic` is the MQTT topic pattern where to receive the messages

==== Kafka

The Decanter Kafka collector receives collected messages from a Kafka broker. It's a way to aggregate collected data coming
from (several) remote machines.

The `decanter-collector-kafka` feature installs the Kafka collector:

----
karaf@root()> feature:install decanter-collector-kafka
----

This feature also installs a default `etc/org.apache.karaf.decanter.collector.kafka.cfg` configuration file containing:

----
###############################
# Decanter Kafka Configuration
###############################

# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster
#bootstrap.servers=localhost:9092

# An id string to identify the group where the consumer belongs to
#group.id=decanter

# Enable auto commit of consumed messages
#enable.auto.commit=true

# Auto commit interval (in ms) triggering the commit
#auto.commit.interval.ms=1000

# Timeout on the consumer session
#session.timeout.ms=30000

# Serializer class for key that implements the Serializer interface
#key.serializer=org.apache.kafka.common.serialization.StringSerializer

# Serializer class for value that implements the Serializer interface.
#value.serializer=org.apache.kafka.common.serialization.StringSerializer

# Name of the topic
#topic=decanter

# Security (SSL)
#security.protocol=SSL

# SSL truststore location (Kafka broker) and password
#ssl.truststore.location=${karaf.etc}/keystores/keystore.jks
#ssl.truststore.password=karaf

# SSL keystore (if client authentication is required)
#ssl.keystore.location=${karaf.etc}/keystores/clientstore.jks
#ssl.keystore.password=karaf
#ssl.key.password=karaf

# (Optional) SSL provider (default uses the JVM one)
#ssl.provider=

# (Optional) SSL Cipher suites
#ssl.cipher.suites=

# (Optional) SSL Protocols enabled (default is TLSv1.2,TLSv1.1,TLSv1)
#ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1

# (Optional) SSL Truststore type (default is JKS)
#ssl.truststore.type=JKS

# (Optional) SSL Keystore type (default is JKS)
#ssl.keystore.type=JKS

# Security (SASL)
# For SASL, you have to configure Java System property as explained in http://kafka.apache.org/documentation.html#security_ssl
----

The configuration is similar to the Decanter Kafka appender. Please, see the Kafka collector for details.

==== Rest Servlet

The Decanter Rest Servlet collector registers a servlet on the OSGi HTTP service (by default on `/decanter/collect`).

It listens for incoming collected messages on this servlet.

The `decanter-collector-rest-servlet` feature installs the collector:

----
karaf@root()> feature:install decanter-collector-rest-servlet
----

==== REST

The Decanter REST collector periodically requests a REST service and returns the result (with all HTTP details).

The `decanter-collector-rest` feature installs the collector:

----
karaf@root()> feature:install decanter-collector-rest
----

This feature also installs `etc/org.apache.karaf.decanter.collector.rest.cfg` configuration file where you can setup the REST service request:

----
#
# Decanter REST collector
#

url=http://localhost:8080
paths=metrics

#request.method=GET (possible values are GET, POST, PUT, DELETE, default is GET)
#request=foo (request payload)
#header.foo=bar (header passed, prefixed with header.)
#user=user (used for basic authentication)
#password=password (used for basic authentication)
#topic=decanter/collector/rest (Decanter dispatcher topic name to use)

# Unmarshaller to use
unmarshaller.target=(dataFormat=json)
----

==== SOAP

The Decanter SOAP collector periodically requests a SOAP service and returns the result (the SOAP Response, or error details if it failed).

The `decanter-collector-soap` feature installs the collector:

----
karaf@root()> feature:install decanter-collector-soap
----

This feature also installs `etc/org.apache.karaf.decanter.collector.soap.cfg` configuration file where you can setup the URL of the service and the SOAP request to use:

----
#
# Decanter SOAP collector
#

url=http://localhost:8080/cxf/service
soap.request=
----

The collector sends several collected properties to the dispatcher, especially:

* `soap.response` property contains the actual SOAP response
* `error` is only populated when the service request failed, containing the error detail
* `http.response.code` contains the HTTP status code of the service request

==== Dropwizard Metrics

The Decanter Dropwizard Metrics collector get a `MetricSet` OSGi service and periodically get the metrics in the set.

The `decanter-collector-dropwizard` feature installs the collector:

----
karaf@root()> feature:install decanter-collector-dropwizard
----

As soon as a `MetricSet` (like `MetricRegistry`) service will be available, the collector will get the metrics and
send to the Decanter dispatcher.

==== JDBC

The Decanter JDBC collector periodically executes a query on a database and sends the query result to the dispatcher.

The `decanter-collector-jdbc` feature installs the JDBC collector:

----
karaf@root()> feature:install decanter-collector-jdbc
----

The feature also installs the `etc/org.apache.karaf.decanter.collector.jdbc.cfg` configuration file:

----
#######################################
# Decanter JDBC Collector Configuration
#######################################

# DataSource to use
dataSource.target=(osgi.jndi.service.name=jdbc/decanter)

# SQL Query to retrieve data
query=select * from TABLE
----

This configuration file allows you to configure the datasource to use and the SQL query to perform:

* the `datasource.name` property contains the name of the JDBC datasource to use to connect to the database. You can
  create this datasource using the Karaf `jdbc:create` command (provided by the `jdbc` feature).
* the `query` property contains the SQL query to perform on the database and retrieve data.

This collector is periodically executed by the Karaf scheduler.

==== ConfigAdmin

The Decanter ConfigAdmin collector listens for any configuration change and send the updated configuration to the dispatcher.

The `decanter-collector-configadmin` feature installs the ConfigAdmin collector:

----
karaf@root()> feature:install decanter-collector-configadmin
----

==== Prometheus

The Decanter Prometheus collector is able to periodically (scheduled collector) read Prometheus servlet output to create events sent in Decanter.

The `decanter-collector-prometheus` feature installs the Prometheus collector:

----
karaf@root()> feature:install decanter-collector-prometheus
----

The feature also installs the `etc/org.apache.karaf.decanter.collector.prometheus.cfg` configuration file containing:

----
prometheus.url=http://host/prometheus
----

The `prometheus.url` property is mandatory and define the location of the Prometheus export servlet (that could be provided by the Decanter Prometheus appender for instance).

==== Redis

The Decanter Redis collector is able to periodically (scheduled collector) read Redis Map to get key/value pairs.
You can filter the keys you want thanks to key pattern.

The `decanter-collector-redis` feature installs the Redis collector:

----
karaf@root()> feature:install decanter-collector-redis
----

The feature also installs the `etc/org.apache.karaf.decanter.collector.redis.cfg` configuration file containing:

----
address=localhost:6379

#
# Define the connection mode.
# Possible modes: Single (default), Master_Slave, Sentinel, Cluster
#
mode=Single

#
# Name of the Redis map
# Default is Decanter
#
map=Decanter

#
# For Master_Slave mode, we define the location of the master
# Default is localhost:6379
#
#masterAddress=localhost:6379

#
# For Sentinel model, define the name of the master
# Default is myMaster
#
#masterName=myMaster

#
# For Cluster mode, define the scan interval of the nodes in the cluster
# Default value is 2000 (2 seconds).
#
#scanInterval=2000

#
# Key pattern to looking for.
# Default is *
#
#keyPattern=*
----

You can configure the Redis connection (depending of the topology) and the key pattern in this configuration file.

==== Elasticsearch

The Decanter Elasticsearch collector retrieves documents from Elasticsearch periodically (scheduled collector).
By default, it harvests all documents in the given index, but you can also specify a query.

The `decanter-collector-elasticsearch` feature installs the Elasticsearch collector:

----
karaf@root()> feature:install decanter-collector-elasticsearch
----

The feature also install `etc/org.apache.karaf.decanter.collector.elasticsearch.cfg` configuration file containing:

----
# HTTP address of the elasticsearch nodes (separated with comma)
addresses=http://localhost:9200

# Basic username and password authentication (no authentication by default)
#username=user
#password=password

# Name of the index to request (decanter by default)
#index=decanter

# Query to request document (match all by default)
#query=

# Starting point for the document query (no from by default)
#from=

# Max number of documents retrieved (no max by default)
#max=

# Search timeout, in seconds (no timeout by default)
#timeout=
----

* `addresses` property is the location of the Elasticsearch instances. Default is `http://localhost:9200`.
* `username` and `password` properties are used for authentication. They are `null` (no authentication) by default.
* `index` property is the Elasticsearch index where to get documents. It's `decanter` by default.
* `query` property is a search query to use. Default is `null` meaning all documents in the index are harvested.
* `from` and `max` properties are used to "square" the query. They are `null` by default.
* `timeout` property limits the query execution. There's no timeout by default.

==== Pax Web Jetty Handler

Pax Web Jetty Handler collector "intercepts" all HTTP exchanges with the Pax Web Jetty container running in Apache Karaf.

The `decanter-collector-jetty` feature installs the Pax Web Jetty container:

```
karaf@root()> feature:install decanter-collector-jetty
```

The collector automatically registers in the Pax Web Jetty container and then all HTTP requests/responses data will be sent to the appenders.

==== SNMP

Decanter SNMP Collector allows you to trap or poll metrics from SNMP.

The `decanter-collector-snmp` feature installs the SNMP collector:

----
karaf@root()> feature:install decanter-collector-snmp
----

Actually, this collector provides two kind of collectors: poller or trap.

===== Trap

If you want to use SNMP trap, you have to create `etc/org.apache.karaf.decanter.collector.snmp.trap.cfg` configuration file containing:

----
address=127.0.0.1:161
protocol=tcp
----

* `address` is the listening SNMP trap address
* `protocol` is the transport protocol (TCP or UDP).

===== Poll

If you want to use SNMP poller (periodically getting SNMP metrics), you have to create `etc/org.apache.karaf.decanter.collector.snmp.poll.cfg` configuration file containing:

----
address=127.0.0.1:161
protocol=tcp
retries=2
timeout=1500
treelist=false
oids=first,second
snmp.version=3
security.level=3
security.name=security
authentication.protocol=MD5
authentication.passphrase=pass
privacy.protocol=DES
privacy.passphrase=pass
#snmp.context.engine.id=foo
#snmp.context.name=foo
snmp.community=public
----

* `address` is the SNMP service address
* `protocol` is the transport protocol (tcp or udp)
* `retries` is the number of attempts
* `timeout` is the SNMP request timeout (in ms)
* `treelist` is true to request SNMP tree, false else
* `oids` is the list of SNMP OIDs to request
* `snmp.version` is the SNMP version to use (3 by default)
* `security.level` is the level of security expected by the SNMP version (3 == AUTH_PRIV by default)
* `security.name` is the security name alias
* `authentication.protocol` is the password protocol (MD5 or SHA1)
* `authentication.passphrase` is the password/passphrase to use
* `privacy.protocol` is DES, TRIDES, AES128, AES192, AES256
* `private.passphrase` is the password/passphrase to use
* `snmp.context.engine.id` is optional
* `snmp.context.name` is optional
* `snmp.community` is the community to use, `public` by default

==== Customizing properties in collectors

You can add, rename or remove properties collected by the collectors before sending it to the dispatcher.

In the collector configuration file (for instance `etc/org.apache.karaf.decanter.collector.jmx-local.cfg` for the local JMX collector), you
can add any property. By default, the property is added to the data sent to the dispatcher.

You can prefix the configuration property with the action you can perform before sending:

* `fields.add.` adds a property to the data sent. The following add property `hello` with value `world`:

    ----
    fields.add.hello=world
    ----

* `fields.remove.` removes a property to the data sent:

    ----
    fields.remove.hello=
    ----

* `fields.rename.` rename a property with another name:

    ----
    fields.rename.helo=hello
    ----