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

  Overview
  --------
Apache Karaf Decanter 1.3.0 is a major new Decanter release, providing 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-4647] - Can't append into Elasticsearch with JMS
    * [KARAF-4757] - Decanter: elasticsearch-appender-rest shouldn't be dependent on http
    * [KARAF-4767] - Decanter: collectors and appenders can't be re-used without default configuration

** Improvement
    * [KARAF-4749] - Support range, equal, and notequal for BigDecimal in org/apache/karaf/decanter/sla/checker/Checker.java
    * [KARAF-4791] - Decanter: elasticsearch-rest appender should support multipe addresses
    * [KARAF-4794] - Decanter: make sure the discovery is disabled if only one address is configured
    * [KARAF-4799] - JMS collector should support TextMessage

** New Feature
    * [KARAF-4706] - Create MQTT collector
    * [KARAF-4742] - Decanter: Add Java Process JMX Collector

                    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
