/*
 * 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.
 */

Welcome to Apache Karaf Decanter
================================
Apache Karaf Decanter is a complete monitoring platform for Apache Karaf.
It is very extensible, flexible, easy to install and use.

Apache Karaf Decanter is composed into:
    * Collectors
      The collectors are OSGi services responsible of harvesting monitoring data.
      Two kinds of collectors are available:
      - the polling collectors are invoked periodically by a scheduler
      - the event driven collectors react to some events.
      It's very dynamic (thanks to the OSGi services), so it's possible to add
      a new custom collector (user/custom implementations).
    * Dispatcher
      The dispatcher is called by the scheduler or the event driven collectors
      to dispatch the collected data to the appenders.
    * Appenders
      The appenders are responsible to send/store the collected data to target
      systems.
    * Alerting
      The alerting layer provides a checker, responsible of testing values of
      harvested data (coming from the collectors) and send alerts when the data
      is not in the expected state.

Getting Started
===============
Apache Karaf Decanter is available as a Karaf features. The following command registers
the Karaf Decanter features repository.

feature:repo-add decanter

Depending of what you want to monitor and collect, you have to install the corresponding features
using feature:install command.

Features
========

See user guide for the details of Decanter features:

Collectors
-----------
* decanter-collector-camel
* decanter-collector-dropwizard
* decanter-collector-eventadmin
* decanter-collector-file
* decanter-collector-jms
* decanter-collector-jmx
* decanter-collector-kafka
* decanter-collector-log
* decanter-collector-log4j-socket
* decanter-collector-mqtt
* decanter-collector-process
* decanter-collector-rest
* decanter-collector-rest-servlet
* decanter-collector-socket
* decanter-collector-system

Appenders
---------
* decanter-appender-camel
* decanter-appender-cassandra
* decanter-appender-dropwizard
* decanter-appender-elasticsearch-jest
* decanter-appender-elasticsearch-native-1.x
* decanter-appender-elasticsearch-native-2.x
* decanter-appender-elasticsearch-rest
* decanter-appender-file
* decanter-appender-jdbc
* decanter-appender-jms
* decanter-appender-kafka
* decanter-appender-log
* decanter-appender-mongodb
* decanter-appender-mqtt
* decanter-appender-orientdb
* decanter-appender-redis
* decanter-appender-rest
* decanter-appender-socket

Alerters
------------
* decanter-alerting-log
* decanter-alerting-email
* decanter-alerting-camel

Additional features
-------------------
WARNING: Since Apache Karaf Decanter 2.0.0, it's not recommended to use the embedded instances of these backends.
We encourage users to install, setup and start backends.

* elasticsearch 1.7.4
* elasticsearch 2.2.0
* elasticsearch 5.6.3
* elasticsearch 6.1.1
* elasticsearch-head 1.7.4
* elasticsearch-head 2.2.0
* kibana 3.1.1
* kibana 4.1.2
* kibana 6.1.1
* orientdb 2.2.31

Thanks for using Apache Karaf Decanter !

--
The Karaf Team
