/*
 * 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 and SLA Policies
      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).
      The collectors are also responsible of checking the SLA, and delegate to
      a notifier.
    * Scheduler
      The scheduler service is responsible to call the Polling Collectors,
      gather the harvested data, and delegate to the dispatcher.
    * 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.
    * Notifier
      The notifier is called by the collectors' SLA. The notifier uses external
      system to "publish" the SLA alert.
    * Console & Web UI
      The console is responsible of both SLA configuration and dashboard view.

Getting Started
===============
Apache Karaf Decanter is available as a Karaf features. The commands below start 
the jmx collector, log collector and an appender to a local elasticsearch instance
on the default port. Prerquisite is a running elasticsearch instance.

feature:repo-add decanter 1.3.0

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-log
* decanter-collector-log-socket
* decanter-collector-file
* decanter-collector-eventadmin
* decanter-collector-jms
* decanter-collector-jmx
* decanter-collector-kafka
* decanter-collector-rest
* decanter-collector-activemq
* decanter-collector-camel
* decanter-collector-camel-tracer
* decanter-collector-mqtt
* decanter-collector-rest
* decanter-collector-rest-servlet
* decanter-collector-socket
* decanter-collector-system

Appenders
---------
* decanter-appender-log
* decanter-appender-elasticsearch-rest
* decanter-appender-elasticsearch-native-1.x
* decanter-appender-elasticsearch-native-2.x
* decanter-appender-jdbc
* decanter-appender-jms
* decanter-appender-camel
* decanter-appender-mqtt
* decanter-appender-kafka
* decanter-appender-cassandra
* decanter-appender-mongodb
* decanter-appender-socket
* decanter-appender-redis
* decanter-appender-rest

SLA/Alerters
------------
* decanter-sla-log
* decanter-sla-email
* decanter-sla-camel

Additional features
-------------------
* elasticsearch 1.7.4
* elasticsearch 2.2.0
* elasticsearch-head 1.7.4
* elasticsearch-head 2.2.0
* kibana 3.1.1
* kibana 4.1.2

Thanks for using Apache Karaf Decanter !

--
The Karaf Team
