/*
 * 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.1.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-jmx
* decanter-collector-rest
* decanter-collector-activemq
* decanter-collector-camel
* decanter-collector-camel-tracer
* 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-redis

SLA/Alerters
------------
* decanter-sla-log
* decanter-sla-email
* decanter-sla-camel

Additional features
-------------------
* elasticsearch 1.7.3
* elasticsearch 2.2.0
* elasticsearch-head 1.7.3
* elasticsearch-head 2.2.0
* kibana 3.1.1
* kibana 4.1.2

Thanks for using Apache Karaf Decanter !

--
The Karaf Team
