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

                    Apache Karaf Decanter 1.2.0
                    ===========================

  Overview
  --------
Apache Karaf Decanter 1.2.0 is a major new Decanter release, providing lot of new features (new collectors, new
appenders) and bug fixes.

Decanter is a completed monitoring and alerting solution for Apache Karaf container, and related applications
running on it.

You can use Decanter in any Karaf version.

For details, see the ChangeLog:

  ChangeLog
  ---------
** Bug
    * [KARAF-4516] - Extend Karaf feature import version range in Decanter Kibana bundle
    * [KARAF-4525] - Decanter log collector should not ignore the log alerter category
    * [KARAF-4532] - SystemCollector throws IOException
    * [KARAF-4574] - EventAdmin not injected in file collector
    * [KARAF-4580] - Installing elasticsearch feature fails on Windows
    * [KARAF-4594] - Log4J socket collector error handling mutiple clients
    * [KARAF-4604] - JsonUnMarshaller doesn't handle Map and Lists
    * [KARAF-4605] - Kafka Collector uses the same topic for eventadmin and kafka
    * [KARAF-4625] - JMS appender should use MapMessage property instead of JMS properties
    * [KARAF-4629] - Can't append into Elasticsearch

** Dependency upgrade
    * [KARAF-4558] - Upgrade to Elasticsearch 1.7.4
    * [KARAF-4560] - Upgrade to ActiveMQ 5.13.3
    * [KARAF-4561] - Upgrade to Johnzon 0.9.3-incubating

** Improvement
    * [KARAF-4565] - Set ConfigurationPolicy.REQUIRE for decanter appenders and collectors
    * [KARAF-4610] - Improve Decanter scheduler to reduce latency

** New Feature
    * [KARAF-4298] - Add MongoDB appender
    * [KARAF-4320] - Create socket collector and appender
    * [KARAF-4530] - Create Kafka collector
    * [KARAF-4531] - Create JMS collector
    * [KARAF-4546] - Support embedding decanter into spring boot apps

                    Apache Karaf Decanter 1.1.0
                    ===========================

  Overview
  --------
Apache Karaf Decanter 1.1.0 is the first release on the Decanter 1.1.x serie. It's a complete new version of Decanter
including a lot of new features and bug fixes.

Decanter is a completed monitoring and alerting solution for Apache Karaf container, and related applications
running on it.

You can use Decanter in any Karaf version.

For details, see the ChangeLog:

  ChangeLog
  ---------
** Bug
    * [KARAF-4059] - Exception thrown during elasticsearch restart
    * [KARAF-4121] - Escape characters in the log collection
    * [KARAF-4125] - Elasticsearch clusterName and nodeName can't be changed
    * [KARAF-4305] - Logs and JMX stats do not show in kibana with default settings
    * [KARAF-4312] - Have to provide a decanter src distribution
    * [KARAF-4341] - Add REST collector to pull metrics from jolokia
    * [KARAF-4375] - IllegalArgumentException: invalid topic exception
    * [KARAF-4432] - Marshaller is not able to deal with some event properties
    * [KARAF-4440] - Decanter eventadmin collector should cast type property as String
    * [KARAF-4448] - Type property is not correctly populated by the eventadmin collector
    * [KARAF-4453] - Marshaller doesn't include subject property
    * [KARAF-4480] - LogAppender should use timestamp instead of timeStamp

** Dependency upgrade
    * [KARAF-3624] - Provide Kibana 4.1 feature
    * [KARAF-4331] - Upgrade to elasticsearch 2.2.0
    * [KARAF-4431] - Upgrade to kafka 0.9.0.0

** Improvement
    * [KARAF-4113] - Be able to use a remote elasticsearch instance in Decanter Kibana
    * [KARAF-4170] - Authentication to access Kibana dashboard on karaf-decanter
    * [KARAF-4171] - Authentication to access elasticsearch-head on karaf-decanter
    * [KARAF-4295] - Use of Elasticsearch REST API in addition of the TransportClient (by configuration)
    * [KARAF-4300] - Centralize maven bundle plugin config
    * [KARAF-4304] - Cleanup elasticsearch code and build
    * [KARAF-4344] - Migrate decanter to DS
    * [KARAF-4369] - Collect bundle and other OSGi events in decanter
    * [KARAF-4430] - Kafka appender should deal with the ConnectException when the Kafka broker is not available
    * [KARAF-4438] - Define the max.request.size on the kafka appender configuration, and increase the default value
    * [KARAF-4463] - Secure Kibana 4
    * [KARAF-4466] - Add a note about elasticsearch & kibana best practice for large installation
    * [KARAF-4467] - decanter-appender-elasticsearch feature should be an alias to decanter-appender-elasticsearch-native-2.x
    * [KARAF-4481] - LogAppender should check if the event is ignored earlier to avoid useless processing
    * [KARAF-4495] - Add custom fields support in all collectors

** New Feature
    * [KARAF-3698] - Add decanter cassandra appender
    * [KARAF-3773] - Add decanter redis appender
    * [KARAF-4120] - Provide elasticsearch 2.x feature
    * [KARAF-4291] - Add kafka appender
    * [KARAF-4296] - Add mqtt appender
    * [KARAF-4303] - Create decanter marshalling services
    * [KARAF-4321] - Add log4j socket collector
    * [KARAF-4368] - Support SSL for kafka appender
    * [KARAF-4404] - Create eventadmin collector
    * [KARAF-4443] - Create default dahboards in Decanter Kibana 4.x

                    Apache Karaf Decanter 1.0.1
                    ===========================

  Overview
  --------

Apache Karaf Decanter 1.0.1 is a fix version on the decanter-1.x serie. It also brings new features like the file collector.

Decanter is a completed monitoring and alerting solution for Apache Karaf container, and related applications
running on it.

You can use Decanter in any Karaf version.

For details, see the ChangeLog:

  ChangeLog
  ---------
** Bug
    * [KARAF-4061] - Decanter ElasticSearchAppender - NumberFormatException

** Dependency upgrade
    * [KARAF-4063] - Upgrade to elasticsearch 1.7.1
    * [KARAF-4101] - Upgrade to elasticsearch 1.7.3

** Improvement
    * [KARAF-3979] - Be able to define a SLA check for a given type
    * [KARAF-4008] - Add custom fields support in JMX collector
    * [KARAF-4014] - Add a warning in Decanter System dashboard

** New Feature
    * [KARAF-3904] - Add elasticsearch eshead plugin in embedded instance
    * [KARAF-3905] - Provide file collector (as in logstash)

                    Apache Karaf Decanter 1.0.0
                    ===========================

  Overview
  --------

Apache Karaf Decanter 1.0.0 is the first release of Decanter.

Decanter is a completed monitoring and alerting solution for Apache Karaf container, and related applications
running on it.

You can use Decanter in any Karaf version.

For details, see the ChangeLog:

  ChangeLog
  ---------
** Bug
    * [KARAF-3815] - Decanter can't retrieve metrics for ObjectName containing white spaces
    * [KARAF-3855] - Decanter JMX collector create bunch of threads
    * [KARAF-3884] - ElasticsearchAppender sometimes throws NullPointer Exception when adding o.toString() to arrayBuilder
    * [KARAF-3889] - The clusterName for the elasticsearch appender isn't an optional configuration as it should be. 

** Dependency upgrade
    * [KARAF-3845] - Upgrade to elasticsearch 1.6.0
    * [KARAF-3847] - Upgrade to kibana 3.1.2

** Improvement
    * [KARAF-3777] - Add Karaf source IP address or hostname in the collected data
    * [KARAF-3836] - Add a configuration allowing to define the period of the simple scheduler
    * [KARAF-3848] - Be able to define the embedded elasticsearch node by configuration
    * [KARAF-3849] - Provide "key turn" kibana dashboards
    * [KARAF-3851] - Be able to poll remote MBeanServer
    * [KARAF-3883] - The elasticsearch appender uses the default clustername of Elasticsearch client, this needs to be configurable

** New Feature
    * [KARAF-3637] - Decanter: JDBC appender
    * [KARAF-3771] - Add decanter system collector
    * [KARAF-3772] - Add Decanter SLA support
    * [KARAF-3861] - Add CamelAppender
    * [KARAF-3862] - Add CamelSLA
    * [KARAF-3863] - Add CamelTracer collector
    * [KARAF-3865] - Add decanter documentation
    * [KARAF-3866] - Add decanter JMS appender
    * [KARAF-3870] - Create SLA email alerting
    * [KARAF-3881] - The embedded ElasticSearch Node should be configurable through config-admin

** Wish
    * [KARAF-3675] - Check if recent Johnzon snapshot is OSGi ready
