Author: jbonofre
Date: Tue Feb 16 06:45:00 2021
New Revision: 1886565

URL: http://svn.apache.org/viewvc?rev=1886565&view=rev
Log:
[scm-publish] Updating main site with Karaf Decanter documentation

Removed:
    karaf/site/production/manual/decanter/latest-2/pdf/
Modified:
    karaf/site/production/manual/decanter/latest-2/html/alerting.html
    karaf/site/production/manual/decanter/latest-2/html/appenders.html
    karaf/site/production/manual/decanter/latest-2/html/collectors.html
    karaf/site/production/manual/decanter/latest-2/html/index.html
    karaf/site/production/manual/decanter/latest-2/html/introduction.html
    karaf/site/production/manual/decanter/latest-2/html/processors.html

Modified: karaf/site/production/manual/decanter/latest-2/html/alerting.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/html/alerting.html?rev=1886565&r1=1886564&r2=1886565&view=diff
==============================================================================
--- karaf/site/production/manual/decanter/latest-2/html/alerting.html (original)
+++ karaf/site/production/manual/decanter/latest-2/html/alerting.html Tue Feb 
16 06:45:00 2021
@@ -2587,7 +2587,7 @@ the alert rules:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>rule.my="{'condition':'message:*','level':'ERROR'}</pre>
+<pre>rule.my="{'condition':'message:*','level':'ERROR'}"</pre>
 </div>
 </div>
 <div class="paragraph">
@@ -2672,6 +2672,9 @@ If recoverable, you will have a single a
 <li>
 <p><code>alertTimestamp</code> is the alert timestamp added by the alert 
service</p>
 </li>
+<li>
+<p><code>decanter.collector.name</code> is the name of the origintating 
Decanter collector</p>
+</li>
 </ul>
 </div>
 </div>
@@ -2699,6 +2702,19 @@ If recoverable, you will have a single a
 <div class="paragraph">
 <p>This alerter doesn&#8217;t need any configuration.</p>
 </div>
+<div class="admonitionblock caution">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Caution</div>
+</td>
+<td class="content">
+Use the Alerter Log with caution when also using the Log Collector, 
decanter-collector-log, as you can create a loop. Specifically a
+log event will generate an alert event that will generate a log 
event&#8230;&#8203;..
+</td>
+</tr>
+</table>
+</div>
 </div>
 <div class="sect4">
 <h5 id="_e_mail">E-mail</h5>
@@ -2932,7 +2948,7 @@ To "turn" an appender as an alerter, it
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2020-04-01 08:27:43 CEST
+Last updated 2021-01-18 05:57:52 CET
 </div>
 </div>
 </body>

Modified: karaf/site/production/manual/decanter/latest-2/html/appenders.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/html/appenders.html?rev=1886565&r1=1886564&r2=1886565&view=diff
==============================================================================
--- karaf/site/production/manual/decanter/latest-2/html/appenders.html 
(original)
+++ karaf/site/production/manual/decanter/latest-2/html/appenders.html Tue Feb 
16 06:45:00 2021
@@ -2627,9 +2627,22 @@ It transforms the data as a json documen
 </div>
 </div>
 <div class="paragraph">
-<p>By default, the file appender stores the collected data in 
<code>${karaf.data}/decanter</code> file. You can change the file where to 
store the data
+<p>By default, the file appender stores the collected data in 
<code>${karaf.data}/decanter/appender.csv</code> file. You can change the file 
where to store the data
 using the <code>filename</code> property in 
<code>etc/org.apache.karaf.decanter.appender.file.cfg</code> configuration 
file.</p>
 </div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+The default file changed from <code>${karaf.data}/decanter</code> to 
<code>${karaf.data}/decanter/appender.csv</code> in verson 2.7.0 due to a
+conflict with the Alerting Service.
+</td>
+</tr>
+</table>
+</div>
 <div class="paragraph">
 <p>You can also change the marshaller to use. By default, the marshaller used 
is the CSV one. But you can switch to the JSON one
 using the <code>marshaller.target</code> property in 
<code>etc/org.apache.karaf.decanter.appender.file.cfg</code> configuration 
file.</p>
@@ -3015,6 +3028,60 @@ destination.uri=direct-vm:decanter</pre>
 </div>
 </div>
 <div class="sect3">
+<h4 id="_loki">Loki</h4>
+<div class="paragraph">
+<p>Loki (<a href="https://grafana.com/oss/loki/"; 
class="bare">https://grafana.com/oss/loki/</a>) is a log aggregation system. 
The Decanter Loki appender is able to push collected data
+to Loki via the Push API.</p>
+</div>
+<div class="paragraph">
+<p>The Decanter Loki appender converts any kind of collected data (coming from 
the dispatcher) as a log string that can be stored in Loki.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-loki</code> feature installs the Loki 
appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-appender-loki</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also adds 
<code>etc/org.apache.karaf.decanter.appender.loki.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>######################################
+# Decanter Loki Appender Configuration
+######################################
+
+# Loki push API location
+#loki.url=http://localhost:3100/loki/api/v1/push
+
+# Loki tenant
+#loki.tenant=my-tenant
+
+# Loki basic authentication
+#loki.username=
+#loki.password=
+
+# Marshaller
+#marshaller.target=(dataFormat=raw)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>loki.url</code> is the location of the Loki push API</p>
+</li>
+<li>
+<p><code>loki.tenant</code> is optional and define the tenant used to push 
data</p>
+</li>
+<li>
+<p><code>loki.username</code> and <code>loki.password</code> are used for 
basic authentication</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
 <h4 id="_redis">Redis</h4>
 <div class="paragraph">
 <p>The Decanter Redis appender sends the data (collected by the collectors) to 
a Redis broker.</p>
@@ -3320,7 +3387,16 @@ containing:</p>
 #host=localhost
 
 # Port number where to send the collected data
-#port=34343</pre>
+#port=34343
+
+# If connected is true, the socket connection is created when the appender 
starts and
+# collected data are "streamed" to the socket.
+# If connected is false (default), a new socket connection is created for each 
data
+# to send to the socket.
+#connected=false
+
+# Marshaller to use
+marshaller.target=(dataFormat=json)</pre>
 </div>
 </div>
 <div class="ulist">
@@ -3331,6 +3407,12 @@ containing:</p>
 <li>
 <p>the <code>port</code> property contains the port number of the remote 
network socket collector</p>
 </li>
+<li>
+<p>the <code>connected</code> property defines if the socket connection is 
created when the appender starts, or for each data event.</p>
+</li>
+<li>
+<p>the <code>marshaller.target</code> property defines the data format to 
use.</p>
+</li>
 </ul>
 </div>
 </div>
@@ -3486,7 +3568,7 @@ of the OrientDB database to use:</p>
 to "push" these metrics to some backend.</p>
 </div>
 <div class="paragraph">
-<p>The <code>decanter-appender-dropwizard</code> feature provides the Decanter 
event handler registering the harvested data ino the
+<p>The <code>decanter-appender-dropwizard</code> feature provides the Decanter 
event handler registering the harvested data into the
 <code>MetricRegistry</code>:</p>
 </div>
 <div class="listingblock">
@@ -3511,8 +3593,6 @@ to "push" these metrics to some backend.
 <pre class="CodeRay highlight"><code>docker run -d --name timescaledb -p 
5432:5432 -e POSTGRES_PASSWORD=decanter -e POSTGRES_USER=decanter -e 
POSTGRES_DATABASE=decanter timescale/timescaledb</code></pre>
 </div>
 </div>
-<div class="sect4">
-<h5 id="_timescaledb_appender">TimescaleDB appender</h5>
 <div class="paragraph">
 <p>The <code>decanter-appender-timescaledb</code> feature installs the 
TimescaleDB appender.</p>
 </div>
@@ -3570,8 +3650,8 @@ The table is simple and contains just tw
 </ul>
 </div>
 </div>
-<div class="sect4">
-<h5 id="_websocket_servlet">WebSocket Servlet</h5>
+<div class="sect3">
+<h4 id="_websocket_servlet">WebSocket Servlet</h4>
 <div class="paragraph">
 <p>The <code>decanter-appender-websocket-servlet</code> feature exposes a 
websocket on which clients can register. Then, Decanter will send the collected 
data to the connected clients.</p>
 </div>
@@ -3614,8 +3694,8 @@ ID │ Servlet                  â”�
 </div>
 </div>
 </div>
-<div class="sect4">
-<h5 id="_prometheus">Prometheus</h5>
+<div class="sect3">
+<h4 id="_prometheus">Prometheus</h4>
 <div class="paragraph">
 <p>The <code>decanter-appender-prometheus</code> feature collects and exposes 
metrics on prometheus:</p>
 </div>
@@ -3697,12 +3777,174 @@ You just have to import <code>io.prometh
 <p>That&#8217;s the only thing you need: your metrics will be available on the 
Decanter Prometheus servlet (again on <code><a 
href="http://localhost:8181/decanter/prometheus"; 
class="bare">http://localhost:8181/decanter/prometheus</a></code> by 
default).</p>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_rest">Rest</h4>
+<div class="paragraph">
+<p>Decanter Rest appender send collected data to a remote REST service.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-rest</code> feature installs the Rest 
appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-appender-rest</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature also installs 
<code>etc/org.apache.karaf.decanter.appender.rest.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>###############################
+# Decanter Appender REST Configuration
+###############################
+
+# Mandatory URI where the REST appender connects to
+uri=
+
+#request.method=POST (the REST verb)
+#user= (for basic authentication)
+#password= (for basic authentication)
+#content.type=application/json (the message content type sent)
+#charset=utf-8 (the message charset)
+#header.foo= (HTTP header prefixed with header.)
+#payload.header= (if set the Decanter collected data is sent as HTTP header 
instead of body)
+
+# Marshaller to use (json is recommended)
+marshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>uri</code> is mandatory and contains the location of the Rest service 
to call</p>
+</li>
+<li>
+<p><code>user</code> and <code>password</code> are used if the Rest service 
uses basic authentication</p>
+</li>
+<li>
+<p><code>content.type</code> is the message type sent to the Rest service 
(default is <code>application/json</code>)</p>
+</li>
+<li>
+<p><code>charset</code> is the message encoding (default is 
<code>utf-8</code>)</p>
+</li>
+<li>
+<p><code>header.</code> allows you to add any custom HTTP headers (parameters) 
to the request (prefixed by <code>header.</code>)</p>
+</li>
+<li>
+<p><code>payload.header</code> allows you to use a HTTP header to send the 
collected data instead of directly the "body".</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_hdfs">HDFS</h4>
+<div class="paragraph">
+<p>Decanter HDFS appender stores collected data into a HDFS file.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-hdfs</code> feature installs the HDFS 
appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>karaf@root()&gt; feature:install 
decanter-appender-hdfs</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature also installs 
<code>etc/org.apache.karaf.decanter.appender.hdfs.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>######################################
+# Decanter HDFS Appender Configuration
+######################################
+
+# Optional HDFS configuration
+#hdfs.configuration=
+
+# File mode (create or append)
+#hdfs.mode=create|append|overwrite
+
+# Path location
+#hdfs.path=
+
+# Marshaller
+marshaller.target=(dataFormat=csv)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>hdfs.configuration</code> is the location of the hdfs configuration 
file (core or site)</p>
+</li>
+<li>
+<p><code>hdfs.mode</code> defines the way of populating the file on HDFS 
(creating a new one, appending to an existing one, overwriting an existing 
one)</p>
+</li>
+<li>
+<p><code>hdfs.path</code> defines the location and name of the file on HDFS</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_amazon_s3">Amazon S3</h4>
+<div class="paragraph">
+<p>Decanter Amazon S3 appender stores collected data as objects in a S3 
bucket.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-s3</code> feature installs the S3 appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-appender-s3</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature also installs 
<code>etc/org.apache.karaf.decanter.appender.hdfs.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>###############################
+# Decanter Appender S3 Configuration
+###############################
+
+# AWS credentials
+accessKeyId=
+secretKeyId=
+
+# AWS Region (optional)
+#region=
+
+# S3 bucket name
+bucket=
+
+
+# Marshaller to use
+marshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>accessKeyId</code> property is required, containing your AWS access 
key</p>
+</li>
+<li>
+<p><code>secretKeyId</code> property is required, containing your AWS secret 
key</p>
+</li>
+<li>
+<p><code>region</code> property is optional and allows you to define the 
Amazon region to use</p>
+</li>
+<li>
+<p><code>bucket</code> property is required, containing the name of the S3 
bucket where to add objects</p>
+</li>
+</ul>
+</div>
 </div>
 </div>
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2020-04-01 08:27:43 CEST
+Last updated 2021-02-10 13:42:32 CET
 </div>
 </div>
 </body>

Modified: karaf/site/production/manual/decanter/latest-2/html/collectors.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/html/collectors.html?rev=1886565&r1=1886564&r2=1886565&view=diff
==============================================================================
--- karaf/site/production/manual/decanter/latest-2/html/collectors.html 
(original)
+++ karaf/site/production/manual/decanter/latest-2/html/collectors.html Tue Feb 
16 06:45:00 2021
@@ -3200,11 +3200,13 @@ object.name=org.apache.camel:context=*,t
 <div class="sect4">
 <h5 id="_camel_tracer">Camel Tracer</h5>
 <div class="paragraph">
-<p>If you enable the tracer on a Camel route, all tracer events (exchanges on 
each step of the route) are sent to the
-appenders.</p>
+<p>Decanter Camel Tracer is actually an intercept strategy.</p>
 </div>
 <div class="paragraph">
-<p>The <code>decanter-collector-camel</code> feature provides the Camel Tracer 
Handler:</p>
+<p>It catches all exchanges in the route. If you enable the tracer on a Camel 
route, all events (exchanges on each step of the route) are sent to the 
dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-camel</code> feature provides the Decanter 
Camel intercept strategy:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -3212,11 +3214,17 @@ appenders.</p>
 </div>
 </div>
 <div class="paragraph">
-<p>Now, you can use the Decanter Camel Tracer Handler in a tracer that you can 
use in routes.</p>
+<p>You just have to register Decanter intercept strategy in your Camel 
Context:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>DecanterInterceptStrategy decanterCamelTracer = new 
DecanterInterceptStrategy();
+decanterCamelTracer.setDispatcher(eventAdmin);
+camelContext.addInterceptStrategy(decanterCamelTracer);</pre>
+</div>
 </div>
 <div class="paragraph">
-<p>For instance, the following route definition shows how to enable tracer on 
a route, and use the Decanter Tracer Handler
-in the Camel Tracer:</p>
+<p>This is an example of a complete route with Decanter Camel intercept 
strategy:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -3225,18 +3233,14 @@ in the Camel Tracer:</p>
 
     &lt;reference id="dispatcher" 
interface="org.osgi.service.event.EventAdmin"/&gt;
 
-    &lt;bean id="traceHandler" 
class="org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler"&gt;
+    &lt;bean id="decanterInterceptor" 
class="org.apache.karaf.decanter.collector.camel.DecanterInterceptStrategy"&gt;
         &lt;property name="dispatcher" ref="dispatcher"/&gt;
     &lt;/bean&gt;
 
-    &lt;bean id="tracer" 
class="org.apache.camel.processor.interceptor.Tracer"&gt;
-        &lt;property name="traceHandler" ref="traceHandler"/&gt;
-        &lt;property name="enabled" value="true"/&gt;
-        &lt;property name="traceOutExchanges" value="true"/&gt;
-        &lt;property name="logLevel" value="OFF"/&gt;
-    &lt;/bean&gt;
-
-    &lt;camelContext trace="true" 
xmlns="http://camel.apache.org/schema/blueprint"&gt;
+    &lt;camelContext xmlns="http://camel.apache.org/schema/blueprint"&gt;
+       &lt;interceptStrategy&gt;
+          &lt;bean ref="decanterInterceptor"/&gt;
+        &lt;/interceptStrategy&gt;
         &lt;route id="test"&gt;
             &lt;from uri="timer:fire?period=10000"/&gt;
             &lt;setBody&gt;&lt;constant&gt;Hello 
World&lt;/constant&gt;&lt;/setBody&gt;
@@ -3260,7 +3264,7 @@ in the Camel Tracer:</p>
 </div>
 </div>
 <div class="paragraph">
-<p>You can inject your extender using <code>setExtender(myExtender)</code> on 
the <code>DecanterTraceEventHandler</code>. Decanter will automatically
+<p>You can inject your extender using <code>setExtender(myExtender)</code> on 
the <code>DecanterInterceptStrategy</code>. Decanter will automatically
 call your extender to populate extra properties.</p>
 </div>
 </div>
@@ -3440,6 +3444,9 @@ call your extender to populate extra pro
 # Port number on which to listen
 #port=34343
 
+# Binding address on which to listen
+#host=0.0.0.0
+
 # Number of worker threads to deal with
 #workers=10
 
@@ -3457,6 +3464,9 @@ unmarshaller.target=(dataFormat=json)</p
 <p>the <code>port</code> property contains the port number where the network 
socket collector is listening</p>
 </li>
 <li>
+<p>the <code>host</code> property contains the host name/interface address 
where the network socket collector is listening</p>
+</li>
+<li>
 <p>the <code>workers</code> property contains the number of worker threads the 
socket collector is using for the connection</p>
 </li>
 <li>
@@ -3672,6 +3682,54 @@ from (several) remote machines.</p>
 </div>
 </div>
 <div class="sect3">
+<h4 id="_rest">REST</h4>
+<div class="paragraph">
+<p>The Decanter REST collector periodically requests a REST service and 
returns the result (with all HTTP details).</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-rest</code> feature installs the collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-rest</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also installs 
<code>etc/org.apache.karaf.decanter.collector.rest.cfg</code> configuration 
file where you can setup the REST service request:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter REST collector
+#
+
+url=http://localhost:8080
+paths=metrics
+
+#request.method=GET (possible values are GET, POST, PUT, DELETE, default is 
GET)
+#request=foo (request payload)
+#header.foo=bar (header passed, prefixed with header.)
+#user=user (used for basic authentication)
+#password=password (used for basic authentication)
+#topic=decanter/collector/rest (Decanter dispatcher topic name to use)
+
+# Possible to wrap exception as HTTP response, where you can define the HTTP 
response code
+# exception.as.http.response=true
+# exception.http.response.code=501
+
+# Unmarshaller to use
+unmarshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>exception.as.http.response</code> property allows you to "wrap" 
any connection exception as a HTTP message.
+If <code>true</code>, any exception is catched and we send kind of HTTP 
message in the Decanter dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>It&#8217;s also possible to define a HTTP response code (thanks to 
<code>exception.http.response.code</code> property) when an exception is 
catched.</p>
+</div>
+</div>
+<div class="sect3">
 <h4 id="_soap">SOAP</h4>
 <div class="paragraph">
 <p>The Decanter SOAP collector periodically requests a SOAP service and 
returns the result (the SOAP Response, or error details if it failed).</p>
@@ -3946,6 +4004,230 @@ addresses=http://localhost:9200
 </div>
 </div>
 <div class="sect3">
+<h4 id="_pax_web_jetty_handler">Pax Web Jetty Handler</h4>
+<div class="paragraph">
+<p>Pax Web Jetty Handler collector "intercepts" all HTTP exchanges with the 
Pax Web Jetty container running in Apache Karaf.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-jetty</code> feature installs the Pax Web 
Jetty container:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>karaf@root()&gt; feature:install 
decanter-collector-jetty</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The collector automatically registers in the Pax Web Jetty container and 
then all HTTP requests/responses data will be sent to the appenders.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_snmp">SNMP</h4>
+<div class="paragraph">
+<p>Decanter SNMP Collector allows you to trap or poll metrics from SNMP.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-snmp</code> feature installs the SNMP 
collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-snmp</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Actually, this collector provides two kind of collectors: poller or 
trap.</p>
+</div>
+<div class="sect4">
+<h5 id="_trap">Trap</h5>
+<div class="paragraph">
+<p>If you want to use SNMP trap, you have to create 
<code>etc/org.apache.karaf.decanter.collector.snmp.trap.cfg</code> 
configuration file containing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>address=127.0.0.1:161
+protocol=tcp</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>address</code> is the listening SNMP trap address</p>
+</li>
+<li>
+<p><code>protocol</code> is the transport protocol (TCP or UDP).</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_poll">Poll</h5>
+<div class="paragraph">
+<p>If you want to use SNMP poller (periodically getting SNMP metrics), you 
have to create 
<code>etc/org.apache.karaf.decanter.collector.snmp.poll.cfg</code> 
configuration file containing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>address=127.0.0.1:161
+protocol=tcp
+retries=2
+timeout=1500
+treelist=false
+oids=first,second
+snmp.version=3
+security.level=3
+security.name=security
+authentication.protocol=MD5
+authentication.passphrase=pass
+privacy.protocol=DES
+privacy.passphrase=pass
+#snmp.context.engine.id=foo
+#snmp.context.name=foo
+snmp.community=public</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>address</code> is the SNMP service address</p>
+</li>
+<li>
+<p><code>protocol</code> is the transport protocol (tcp or udp)</p>
+</li>
+<li>
+<p><code>retries</code> is the number of attempts</p>
+</li>
+<li>
+<p><code>timeout</code> is the SNMP request timeout (in ms)</p>
+</li>
+<li>
+<p><code>treelist</code> is true to request SNMP tree, false else</p>
+</li>
+<li>
+<p><code>oids</code> is the list of SNMP OIDs to request</p>
+</li>
+<li>
+<p><code>snmp.version</code> is the SNMP version to use (3 by default)</p>
+</li>
+<li>
+<p><code>security.level</code> is the level of security expected by the SNMP 
version (3 == AUTH_PRIV by default)</p>
+</li>
+<li>
+<p><code>security.name</code> is the security name alias</p>
+</li>
+<li>
+<p><code>authentication.protocol</code> is the password protocol (MD5 or 
SHA1)</p>
+</li>
+<li>
+<p><code>authentication.passphrase</code> is the password/passphrase to use</p>
+</li>
+<li>
+<p><code>privacy.protocol</code> is DES, TRIDES, AES128, AES192, AES256</p>
+</li>
+<li>
+<p><code>private.passphrase</code> is the password/passphrase to use</p>
+</li>
+<li>
+<p><code>snmp.context.engine.id</code> is optional</p>
+</li>
+<li>
+<p><code>snmp.context.name</code> is optional</p>
+</li>
+<li>
+<p><code>snmp.community</code> is the community to use, <code>public</code> by 
default</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_druid">Druid</h4>
+<div class="paragraph">
+<p>Karaf Decanter Druid collector schedules execution of queries on Apache 
Druid broker.</p>
+</div>
+<div class="paragraph">
+<p>It allows to easily create analytics on data and schedule execution with 
Decanter. Then, the query result is sent to the dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>The <code>karaf-collector-druid</code> feature installs the Druid 
collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-druid</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The location of the Apache Druid broker and Druid queries to execute are 
configured in <code>etc/org.apache.karaf.decanter.collector.druid.cfg</code> 
configuration file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Druid broker query API location
+#
+druid.broker.location=http://localhost:8888/druid/v2/sql/
+
+# Druid queries set, using syntax: query.id
+query.foo=select sum_operatingSystem_threadCount from decanter
+
+# Unmarshaller to use
+unmarshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>druid.broker.location</code> is the URL of the Apache Druid 
broker.</p>
+</div>
+<div class="paragraph">
+<p>Then, we can add the Druid queries using the format 
<code>query.ID=QUERY</code>.</p>
+</div>
+<div class="paragraph">
+<p>Decanter Druid collector schedules the queries and send the results in the 
dispatcher.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_openstack">OpenStack</h4>
+<div class="paragraph">
+<p>Karaf Decanter OpenStack collector periodically request OpenStack API to 
get details about openstack ecosystem.</p>
+</div>
+<div class="paragraph">
+<p>The <code>karaf-collector-openstack</code> feature installs the OpenStack 
collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-openstack</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also installs 
<code>etc/org.apache.karaf.decanter.collector.openstack.cfg</code> 
configuration file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter Openstack collector
+#
+# Openstack services API locations
+#
+
+#openstack.identity=http://localhost/identity
+#openstack.project=2c7be0bac05c4144a328d4ab3dfac379
+#openstack.username=admin
+#openstack.password=secret
+#openstack.domain=default
+
+#openstack.compute.enabled=true
+#openstack.compute=http://localhost/compute/v2.1
+#openstack.block.storage.enabled=true
+#openstack.block.storage=http://localhost/volume/v3
+#openstack.image.enabled=true
+#openstack.image=http://localhost/image
+#openstack.metric.enabled=true
+#openstack.metric=http://localhost/metric
+
+# Unmarshaller to use
+unmarshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You have to define the locations of the OpenStack APIs and if you enabled 
requesting the APIs or not.</p>
+</div>
+</div>
+<div class="sect3">
 <h4 id="_customizing_properties_in_collectors">Customizing properties in 
collectors</h4>
 <div class="paragraph">
 <p>You can add, rename or remove properties collected by the collectors before 
sending it to the dispatcher.</p>
@@ -3996,7 +4278,7 @@ fields.rename.helo=hello
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2020-04-23 14:52:08 CEST
+Last updated 2021-02-06 06:36:54 CET
 </div>
 </div>
 </body>

Modified: karaf/site/production/manual/decanter/latest-2/html/index.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/html/index.html?rev=1886565&r1=1886564&r2=1886565&view=diff
==============================================================================
--- karaf/site/production/manual/decanter/latest-2/html/index.html (original)
+++ karaf/site/production/manual/decanter/latest-2/html/index.html Tue Feb 16 
06:45:00 2021
@@ -2591,14 +2591,19 @@ table.CodeRay td.code>pre{padding:0}
 <li><a href="#_mqtt">1.2.14. MQTT</a></li>
 <li><a href="#_kafka">1.2.15. Kafka</a></li>
 <li><a href="#_rest_servlet">1.2.16. Rest Servlet</a></li>
-<li><a href="#_soap">1.2.17. SOAP</a></li>
-<li><a href="#_dropwizard_metrics">1.2.18. Dropwizard Metrics</a></li>
-<li><a href="#_jdbc">1.2.19. JDBC</a></li>
-<li><a href="#_configadmin">1.2.20. ConfigAdmin</a></li>
-<li><a href="#_prometheus">1.2.21. Prometheus</a></li>
-<li><a href="#_redis">1.2.22. Redis</a></li>
-<li><a href="#_elasticsearch">1.2.23. Elasticsearch</a></li>
-<li><a href="#_customizing_properties_in_collectors">1.2.24. Customizing 
properties in collectors</a></li>
+<li><a href="#_rest">1.2.17. REST</a></li>
+<li><a href="#_soap">1.2.18. SOAP</a></li>
+<li><a href="#_dropwizard_metrics">1.2.19. Dropwizard Metrics</a></li>
+<li><a href="#_jdbc">1.2.20. JDBC</a></li>
+<li><a href="#_configadmin">1.2.21. ConfigAdmin</a></li>
+<li><a href="#_prometheus">1.2.22. Prometheus</a></li>
+<li><a href="#_redis">1.2.23. Redis</a></li>
+<li><a href="#_elasticsearch">1.2.24. Elasticsearch</a></li>
+<li><a href="#_pax_web_jetty_handler">1.2.25. Pax Web Jetty Handler</a></li>
+<li><a href="#_snmp">1.2.26. SNMP</a></li>
+<li><a href="#_druid">1.2.27. Druid</a></li>
+<li><a href="#_openstack">1.2.28. OpenStack</a></li>
+<li><a href="#_customizing_properties_in_collectors">1.2.29. Customizing 
properties in collectors</a></li>
 </ul>
 </li>
 <li><a href="#_appenders">1.3. Appenders</a>
@@ -2610,15 +2615,21 @@ table.CodeRay td.code>pre{padding:0}
 <li><a href="#_jms_2">1.3.5. JMS</a></li>
 <li><a href="#_camel">1.3.6. Camel</a></li>
 <li><a href="#_kafka_2">1.3.7. Kafka</a></li>
-<li><a href="#_redis_2">1.3.8. Redis</a></li>
-<li><a href="#_mqtt_2">1.3.9. MQTT</a></li>
-<li><a href="#_cassandra">1.3.10. Cassandra</a></li>
-<li><a href="#_influxdb">1.3.11. InfluxDB</a></li>
-<li><a href="#_mongodb">1.3.12. MongoDB</a></li>
-<li><a href="#_network_socket_2">1.3.13. Network socket</a></li>
-<li><a href="#_orientdb">1.3.14. OrientDB</a></li>
-<li><a href="#_dropwizard_metrics_2">1.3.15. Dropwizard Metrics</a></li>
-<li><a href="#_timescaledb">1.3.16. TimescaleDB</a></li>
+<li><a href="#_loki">1.3.8. Loki</a></li>
+<li><a href="#_redis_2">1.3.9. Redis</a></li>
+<li><a href="#_mqtt_2">1.3.10. MQTT</a></li>
+<li><a href="#_cassandra">1.3.11. Cassandra</a></li>
+<li><a href="#_influxdb">1.3.12. InfluxDB</a></li>
+<li><a href="#_mongodb">1.3.13. MongoDB</a></li>
+<li><a href="#_network_socket_2">1.3.14. Network socket</a></li>
+<li><a href="#_orientdb">1.3.15. OrientDB</a></li>
+<li><a href="#_dropwizard_metrics_2">1.3.16. Dropwizard Metrics</a></li>
+<li><a href="#_timescaledb">1.3.17. TimescaleDB</a></li>
+<li><a href="#_websocket_servlet">1.3.18. WebSocket Servlet</a></li>
+<li><a href="#_prometheus_2">1.3.19. Prometheus</a></li>
+<li><a href="#_rest_2">1.3.20. Rest</a></li>
+<li><a href="#_hdfs">1.3.21. HDFS</a></li>
+<li><a href="#_amazon_s3">1.3.22. Amazon S3</a></li>
 </ul>
 </li>
 <li><a href="#_alerting">1.4. Alerting</a>
@@ -2631,6 +2642,8 @@ table.CodeRay td.code>pre{padding:0}
 <ul class="sectlevel3">
 <li><a href="#_pass_through">1.5.1. Pass Through</a></li>
 <li><a href="#_aggregate">1.5.2. Aggregate</a></li>
+<li><a href="#_groupby">1.5.3. GroupBy</a></li>
+<li><a href="#_apache_camel">1.5.4. Apache Camel</a></li>
 </ul>
 </li>
 </ul>
@@ -2707,16 +2720,30 @@ provides appenders depending on the back
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>karaf@root()&gt; feature:repo-add 
mvn:org.apache.karaf.decanter/apache-karaf-decanter/2.0.0/xml/features</pre>
+<pre>karaf@root()&gt; feature:repo-add 
mvn:org.apache.karaf.decanter/apache-karaf-decanter/2.x.x/xml/features <b 
class="conum">(1)</b></pre>
 </div>
 </div>
+<div class="colist arabic">
+<ol>
+<li>
+<p>Substitute the desired version, i.e. 2.8.0-SNAPSHOT, for 2.x.x</p>
+</li>
+</ol>
+</div>
 <div class="paragraph">
 <p>Or</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>karaf@root()&gt; feature:repo-add decanter 2.0.0</pre>
+<pre>karaf@root()&gt; feature:repo-add decanter 2.x.x <b 
class="conum">(1)</b></pre>
+</div>
 </div>
+<div class="colist arabic">
+<ol>
+<li>
+<p>Substitute the desired version, i.e. 2.8.0-SNAPSHOT, for 2.x.x</p>
+</li>
+</ol>
 </div>
 <div class="paragraph">
 <p>Now, you have to install the collectors, appenders, and eventually alerters 
feature to match your need.</p>
@@ -3352,11 +3379,13 @@ object.name=org.apache.camel:context=*,t
 <div class="sect4">
 <h5 id="_camel_tracer">Camel Tracer</h5>
 <div class="paragraph">
-<p>If you enable the tracer on a Camel route, all tracer events (exchanges on 
each step of the route) are sent to the
-appenders.</p>
+<p>Decanter Camel Tracer is actually an intercept strategy.</p>
+</div>
+<div class="paragraph">
+<p>It catches all exchanges in the route. If you enable the tracer on a Camel 
route, all events (exchanges on each step of the route) are sent to the 
dispatcher.</p>
 </div>
 <div class="paragraph">
-<p>The <code>decanter-collector-camel</code> feature provides the Camel Tracer 
Handler:</p>
+<p>The <code>decanter-collector-camel</code> feature provides the Decanter 
Camel intercept strategy:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -3364,11 +3393,17 @@ appenders.</p>
 </div>
 </div>
 <div class="paragraph">
-<p>Now, you can use the Decanter Camel Tracer Handler in a tracer that you can 
use in routes.</p>
+<p>You just have to register Decanter intercept strategy in your Camel 
Context:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>DecanterInterceptStrategy decanterCamelTracer = new 
DecanterInterceptStrategy();
+decanterCamelTracer.setDispatcher(eventAdmin);
+camelContext.addInterceptStrategy(decanterCamelTracer);</pre>
+</div>
 </div>
 <div class="paragraph">
-<p>For instance, the following route definition shows how to enable tracer on 
a route, and use the Decanter Tracer Handler
-in the Camel Tracer:</p>
+<p>This is an example of a complete route with Decanter Camel intercept 
strategy:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -3377,18 +3412,14 @@ in the Camel Tracer:</p>
 
     &lt;reference id="dispatcher" 
interface="org.osgi.service.event.EventAdmin"/&gt;
 
-    &lt;bean id="traceHandler" 
class="org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler"&gt;
+    &lt;bean id="decanterInterceptor" 
class="org.apache.karaf.decanter.collector.camel.DecanterInterceptStrategy"&gt;
         &lt;property name="dispatcher" ref="dispatcher"/&gt;
     &lt;/bean&gt;
 
-    &lt;bean id="tracer" 
class="org.apache.camel.processor.interceptor.Tracer"&gt;
-        &lt;property name="traceHandler" ref="traceHandler"/&gt;
-        &lt;property name="enabled" value="true"/&gt;
-        &lt;property name="traceOutExchanges" value="true"/&gt;
-        &lt;property name="logLevel" value="OFF"/&gt;
-    &lt;/bean&gt;
-
-    &lt;camelContext trace="true" 
xmlns="http://camel.apache.org/schema/blueprint"&gt;
+    &lt;camelContext xmlns="http://camel.apache.org/schema/blueprint"&gt;
+       &lt;interceptStrategy&gt;
+          &lt;bean ref="decanterInterceptor"/&gt;
+        &lt;/interceptStrategy&gt;
         &lt;route id="test"&gt;
             &lt;from uri="timer:fire?period=10000"/&gt;
             &lt;setBody&gt;&lt;constant&gt;Hello 
World&lt;/constant&gt;&lt;/setBody&gt;
@@ -3412,7 +3443,7 @@ in the Camel Tracer:</p>
 </div>
 </div>
 <div class="paragraph">
-<p>You can inject your extender using <code>setExtender(myExtender)</code> on 
the <code>DecanterTraceEventHandler</code>. Decanter will automatically
+<p>You can inject your extender using <code>setExtender(myExtender)</code> on 
the <code>DecanterInterceptStrategy</code>. Decanter will automatically
 call your extender to populate extra properties.</p>
 </div>
 </div>
@@ -3592,6 +3623,9 @@ call your extender to populate extra pro
 # Port number on which to listen
 #port=34343
 
+# Binding address on which to listen
+#host=0.0.0.0
+
 # Number of worker threads to deal with
 #workers=10
 
@@ -3609,6 +3643,9 @@ unmarshaller.target=(dataFormat=json)</p
 <p>the <code>port</code> property contains the port number where the network 
socket collector is listening</p>
 </li>
 <li>
+<p>the <code>host</code> property contains the host name/interface address 
where the network socket collector is listening</p>
+</li>
+<li>
 <p>the <code>workers</code> property contains the number of worker threads the 
socket collector is using for the connection</p>
 </li>
 <li>
@@ -3824,7 +3861,55 @@ from (several) remote machines.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_soap">1.2.17. SOAP</h4>
+<h4 id="_rest">1.2.17. REST</h4>
+<div class="paragraph">
+<p>The Decanter REST collector periodically requests a REST service and 
returns the result (with all HTTP details).</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-rest</code> feature installs the collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-rest</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also installs 
<code>etc/org.apache.karaf.decanter.collector.rest.cfg</code> configuration 
file where you can setup the REST service request:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter REST collector
+#
+
+url=http://localhost:8080
+paths=metrics
+
+#request.method=GET (possible values are GET, POST, PUT, DELETE, default is 
GET)
+#request=foo (request payload)
+#header.foo=bar (header passed, prefixed with header.)
+#user=user (used for basic authentication)
+#password=password (used for basic authentication)
+#topic=decanter/collector/rest (Decanter dispatcher topic name to use)
+
+# Possible to wrap exception as HTTP response, where you can define the HTTP 
response code
+# exception.as.http.response=true
+# exception.http.response.code=501
+
+# Unmarshaller to use
+unmarshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>exception.as.http.response</code> property allows you to "wrap" 
any connection exception as a HTTP message.
+If <code>true</code>, any exception is catched and we send kind of HTTP 
message in the Decanter dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>It&#8217;s also possible to define a HTTP response code (thanks to 
<code>exception.http.response.code</code> property) when an exception is 
catched.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_soap">1.2.18. SOAP</h4>
 <div class="paragraph">
 <p>The Decanter SOAP collector periodically requests a SOAP service and 
returns the result (the SOAP Response, or error details if it failed).</p>
 </div>
@@ -3867,7 +3952,7 @@ soap.request=</pre>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_dropwizard_metrics">1.2.18. Dropwizard Metrics</h4>
+<h4 id="_dropwizard_metrics">1.2.19. Dropwizard Metrics</h4>
 <div class="paragraph">
 <p>The Decanter Dropwizard Metrics collector get a <code>MetricSet</code> OSGi 
service and periodically get the metrics in the set.</p>
 </div>
@@ -3885,7 +3970,7 @@ send to the Decanter dispatcher.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_jdbc">1.2.19. JDBC</h4>
+<h4 id="_jdbc">1.2.20. JDBC</h4>
 <div class="paragraph">
 <p>The Decanter JDBC collector periodically executes a query on a database and 
sends the query result to the dispatcher.</p>
 </div>
@@ -3932,7 +4017,7 @@ create this datasource using the Karaf <
 </div>
 </div>
 <div class="sect3">
-<h4 id="_configadmin">1.2.20. ConfigAdmin</h4>
+<h4 id="_configadmin">1.2.21. ConfigAdmin</h4>
 <div class="paragraph">
 <p>The Decanter ConfigAdmin collector listens for any configuration change and 
send the updated configuration to the dispatcher.</p>
 </div>
@@ -3946,7 +4031,7 @@ create this datasource using the Karaf <
 </div>
 </div>
 <div class="sect3">
-<h4 id="_prometheus">1.2.21. Prometheus</h4>
+<h4 id="_prometheus">1.2.22. Prometheus</h4>
 <div class="paragraph">
 <p>The Decanter Prometheus collector is able to periodically (scheduled 
collector) read Prometheus servlet output to create events sent in Decanter.</p>
 </div>
@@ -3971,7 +4056,7 @@ create this datasource using the Karaf <
 </div>
 </div>
 <div class="sect3">
-<h4 id="_redis">1.2.22. Redis</h4>
+<h4 id="_redis">1.2.23. Redis</h4>
 <div class="paragraph">
 <p>The Decanter Redis collector is able to periodically (scheduled collector) 
read Redis Map to get key/value pairs.
 You can filter the keys you want thanks to key pattern.</p>
@@ -4033,7 +4118,7 @@ map=Decanter
 </div>
 </div>
 <div class="sect3">
-<h4 id="_elasticsearch">1.2.23. Elasticsearch</h4>
+<h4 id="_elasticsearch">1.2.24. Elasticsearch</h4>
 <div class="paragraph">
 <p>The Decanter Elasticsearch collector retrieves documents from Elasticsearch 
periodically (scheduled collector).
 By default, it harvests all documents in the given index, but you can also 
specify a query.</p>
@@ -4098,7 +4183,231 @@ addresses=http://localhost:9200
 </div>
 </div>
 <div class="sect3">
-<h4 id="_customizing_properties_in_collectors">1.2.24. Customizing properties 
in collectors</h4>
+<h4 id="_pax_web_jetty_handler">1.2.25. Pax Web Jetty Handler</h4>
+<div class="paragraph">
+<p>Pax Web Jetty Handler collector "intercepts" all HTTP exchanges with the 
Pax Web Jetty container running in Apache Karaf.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-jetty</code> feature installs the Pax Web 
Jetty container:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>karaf@root()&gt; feature:install 
decanter-collector-jetty</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The collector automatically registers in the Pax Web Jetty container and 
then all HTTP requests/responses data will be sent to the appenders.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_snmp">1.2.26. SNMP</h4>
+<div class="paragraph">
+<p>Decanter SNMP Collector allows you to trap or poll metrics from SNMP.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-collector-snmp</code> feature installs the SNMP 
collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-snmp</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Actually, this collector provides two kind of collectors: poller or 
trap.</p>
+</div>
+<div class="sect4">
+<h5 id="_trap">Trap</h5>
+<div class="paragraph">
+<p>If you want to use SNMP trap, you have to create 
<code>etc/org.apache.karaf.decanter.collector.snmp.trap.cfg</code> 
configuration file containing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>address=127.0.0.1:161
+protocol=tcp</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>address</code> is the listening SNMP trap address</p>
+</li>
+<li>
+<p><code>protocol</code> is the transport protocol (TCP or UDP).</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_poll">Poll</h5>
+<div class="paragraph">
+<p>If you want to use SNMP poller (periodically getting SNMP metrics), you 
have to create 
<code>etc/org.apache.karaf.decanter.collector.snmp.poll.cfg</code> 
configuration file containing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>address=127.0.0.1:161
+protocol=tcp
+retries=2
+timeout=1500
+treelist=false
+oids=first,second
+snmp.version=3
+security.level=3
+security.name=security
+authentication.protocol=MD5
+authentication.passphrase=pass
+privacy.protocol=DES
+privacy.passphrase=pass
+#snmp.context.engine.id=foo
+#snmp.context.name=foo
+snmp.community=public</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>address</code> is the SNMP service address</p>
+</li>
+<li>
+<p><code>protocol</code> is the transport protocol (tcp or udp)</p>
+</li>
+<li>
+<p><code>retries</code> is the number of attempts</p>
+</li>
+<li>
+<p><code>timeout</code> is the SNMP request timeout (in ms)</p>
+</li>
+<li>
+<p><code>treelist</code> is true to request SNMP tree, false else</p>
+</li>
+<li>
+<p><code>oids</code> is the list of SNMP OIDs to request</p>
+</li>
+<li>
+<p><code>snmp.version</code> is the SNMP version to use (3 by default)</p>
+</li>
+<li>
+<p><code>security.level</code> is the level of security expected by the SNMP 
version (3 == AUTH_PRIV by default)</p>
+</li>
+<li>
+<p><code>security.name</code> is the security name alias</p>
+</li>
+<li>
+<p><code>authentication.protocol</code> is the password protocol (MD5 or 
SHA1)</p>
+</li>
+<li>
+<p><code>authentication.passphrase</code> is the password/passphrase to use</p>
+</li>
+<li>
+<p><code>privacy.protocol</code> is DES, TRIDES, AES128, AES192, AES256</p>
+</li>
+<li>
+<p><code>private.passphrase</code> is the password/passphrase to use</p>
+</li>
+<li>
+<p><code>snmp.context.engine.id</code> is optional</p>
+</li>
+<li>
+<p><code>snmp.context.name</code> is optional</p>
+</li>
+<li>
+<p><code>snmp.community</code> is the community to use, <code>public</code> by 
default</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_druid">1.2.27. Druid</h4>
+<div class="paragraph">
+<p>Karaf Decanter Druid collector schedules execution of queries on Apache 
Druid broker.</p>
+</div>
+<div class="paragraph">
+<p>It allows to easily create analytics on data and schedule execution with 
Decanter. Then, the query result is sent to the dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>The <code>karaf-collector-druid</code> feature installs the Druid 
collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-druid</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The location of the Apache Druid broker and Druid queries to execute are 
configured in <code>etc/org.apache.karaf.decanter.collector.druid.cfg</code> 
configuration file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Druid broker query API location
+#
+druid.broker.location=http://localhost:8888/druid/v2/sql/
+
+# Druid queries set, using syntax: query.id
+query.foo=select sum_operatingSystem_threadCount from decanter
+
+# Unmarshaller to use
+unmarshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>druid.broker.location</code> is the URL of the Apache Druid 
broker.</p>
+</div>
+<div class="paragraph">
+<p>Then, we can add the Druid queries using the format 
<code>query.ID=QUERY</code>.</p>
+</div>
+<div class="paragraph">
+<p>Decanter Druid collector schedules the queries and send the results in the 
dispatcher.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_openstack">1.2.28. OpenStack</h4>
+<div class="paragraph">
+<p>Karaf Decanter OpenStack collector periodically request OpenStack API to 
get details about openstack ecosystem.</p>
+</div>
+<div class="paragraph">
+<p>The <code>karaf-collector-openstack</code> feature installs the OpenStack 
collector:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-collector-openstack</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also installs 
<code>etc/org.apache.karaf.decanter.collector.openstack.cfg</code> 
configuration file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter Openstack collector
+#
+# Openstack services API locations
+#
+
+#openstack.identity=http://localhost/identity
+#openstack.project=2c7be0bac05c4144a328d4ab3dfac379
+#openstack.username=admin
+#openstack.password=secret
+#openstack.domain=default
+
+#openstack.compute.enabled=true
+#openstack.compute=http://localhost/compute/v2.1
+#openstack.block.storage.enabled=true
+#openstack.block.storage=http://localhost/volume/v3
+#openstack.image.enabled=true
+#openstack.image=http://localhost/image
+#openstack.metric.enabled=true
+#openstack.metric=http://localhost/metric
+
+# Unmarshaller to use
+unmarshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You have to define the locations of the OpenStack APIs and if you enabled 
requesting the APIs or not.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_customizing_properties_in_collectors">1.2.29. Customizing properties 
in collectors</h4>
 <div class="paragraph">
 <p>You can add, rename or remove properties collected by the collectors before 
sending it to the dispatcher.</p>
 </div>
@@ -4202,9 +4511,22 @@ It transforms the data as a json documen
 </div>
 </div>
 <div class="paragraph">
-<p>By default, the file appender stores the collected data in 
<code>${karaf.data}/decanter</code> file. You can change the file where to 
store the data
+<p>By default, the file appender stores the collected data in 
<code>${karaf.data}/decanter/appender.csv</code> file. You can change the file 
where to store the data
 using the <code>filename</code> property in 
<code>etc/org.apache.karaf.decanter.appender.file.cfg</code> configuration 
file.</p>
 </div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+The default file changed from <code>${karaf.data}/decanter</code> to 
<code>${karaf.data}/decanter/appender.csv</code> in verson 2.7.0 due to a
+conflict with the Alerting Service.
+</td>
+</tr>
+</table>
+</div>
 <div class="paragraph">
 <p>You can also change the marshaller to use. By default, the marshaller used 
is the CSV one. But you can switch to the JSON one
 using the <code>marshaller.target</code> property in 
<code>etc/org.apache.karaf.decanter.appender.file.cfg</code> configuration 
file.</p>
@@ -4590,7 +4912,61 @@ destination.uri=direct-vm:decanter</pre>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_redis_2">1.3.8. Redis</h4>
+<h4 id="_loki">1.3.8. Loki</h4>
+<div class="paragraph">
+<p>Loki (<a href="https://grafana.com/oss/loki/"; 
class="bare">https://grafana.com/oss/loki/</a>) is a log aggregation system. 
The Decanter Loki appender is able to push collected data
+to Loki via the Push API.</p>
+</div>
+<div class="paragraph">
+<p>The Decanter Loki appender converts any kind of collected data (coming from 
the dispatcher) as a log string that can be stored in Loki.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-loki</code> feature installs the Loki 
appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-appender-loki</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also adds 
<code>etc/org.apache.karaf.decanter.appender.loki.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>######################################
+# Decanter Loki Appender Configuration
+######################################
+
+# Loki push API location
+#loki.url=http://localhost:3100/loki/api/v1/push
+
+# Loki tenant
+#loki.tenant=my-tenant
+
+# Loki basic authentication
+#loki.username=
+#loki.password=
+
+# Marshaller
+#marshaller.target=(dataFormat=raw)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>loki.url</code> is the location of the Loki push API</p>
+</li>
+<li>
+<p><code>loki.tenant</code> is optional and define the tenant used to push 
data</p>
+</li>
+<li>
+<p><code>loki.username</code> and <code>loki.password</code> are used for 
basic authentication</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_redis_2">1.3.9. Redis</h4>
 <div class="paragraph">
 <p>The Decanter Redis appender sends the data (collected by the collectors) to 
a Redis broker.</p>
 </div>
@@ -4678,7 +5054,7 @@ map=Decanter
 </div>
 </div>
 <div class="sect3">
-<h4 id="_mqtt_2">1.3.9. MQTT</h4>
+<h4 id="_mqtt_2">1.3.10. MQTT</h4>
 <div class="paragraph">
 <p>The Decanter MQTT appender sends the data (collected by the collectors) to 
a MQTT broker.</p>
 </div>
@@ -4718,7 +5094,7 @@ map=Decanter
 </div>
 </div>
 <div class="sect3">
-<h4 id="_cassandra">1.3.10. Cassandra</h4>
+<h4 id="_cassandra">1.3.11. Cassandra</h4>
 <div class="paragraph">
 <p>The Decanter Cassandra appender allows you to store the data (coming from 
the collectors) into an Apache Cassandra database.</p>
 </div>
@@ -4771,7 +5147,7 @@ cassandra.port=9042</pre>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_influxdb">1.3.11. InfluxDB</h4>
+<h4 id="_influxdb">1.3.12. InfluxDB</h4>
 <div class="paragraph">
 <p>The Decanter InfluxDB appender allows you to store the data (coming from 
the collectors) as a time series into a InfluxDB database.</p>
 </div>
@@ -4820,7 +5196,7 @@ database=decanter</pre>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_mongodb">1.3.12. MongoDB</h4>
+<h4 id="_mongodb">1.3.13. MongoDB</h4>
 <div class="paragraph">
 <p>The Decanter MongoDB appender allows you to store the data (coming from the 
collectors) into a MongoDB database.</p>
 </div>
@@ -4867,7 +5243,7 @@ containing:</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_network_socket_2">1.3.13. Network socket</h4>
+<h4 id="_network_socket_2">1.3.14. Network socket</h4>
 <div class="paragraph">
 <p>The Decanter network socket appender sends the collected data to a remote 
Decanter network socket collector.</p>
 </div>
@@ -4895,7 +5271,16 @@ containing:</p>
 #host=localhost
 
 # Port number where to send the collected data
-#port=34343</pre>
+#port=34343
+
+# If connected is true, the socket connection is created when the appender 
starts and
+# collected data are "streamed" to the socket.
+# If connected is false (default), a new socket connection is created for each 
data
+# to send to the socket.
+#connected=false
+
+# Marshaller to use
+marshaller.target=(dataFormat=json)</pre>
 </div>
 </div>
 <div class="ulist">
@@ -4906,11 +5291,17 @@ containing:</p>
 <li>
 <p>the <code>port</code> property contains the port number of the remote 
network socket collector</p>
 </li>
+<li>
+<p>the <code>connected</code> property defines if the socket connection is 
created when the appender starts, or for each data event.</p>
+</li>
+<li>
+<p>the <code>marshaller.target</code> property defines the data format to 
use.</p>
+</li>
 </ul>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_orientdb">1.3.14. OrientDB</h4>
+<h4 id="_orientdb">1.3.15. OrientDB</h4>
 <div class="paragraph">
 <p>The Decanter OrientDB appender stores the collected data into OrientDB 
Document database.</p>
 </div>
@@ -5054,14 +5445,14 @@ of the OrientDB database to use:</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_dropwizard_metrics_2">1.3.15. Dropwizard Metrics</h4>
+<h4 id="_dropwizard_metrics_2">1.3.16. Dropwizard Metrics</h4>
 <div class="paragraph">
 <p>The Dropwizard Metrics appender receives the harvested data from the 
dispatcher and pushes to a Dropwizard Metrics
 <code>MetricRegistry</code>. You can register this <code>MetricRegistry</code> 
in your own application or use a Dropwizard Metrics Reporter
 to "push" these metrics to some backend.</p>
 </div>
 <div class="paragraph">
-<p>The <code>decanter-appender-dropwizard</code> feature provides the Decanter 
event handler registering the harvested data ino the
+<p>The <code>decanter-appender-dropwizard</code> feature provides the Decanter 
event handler registering the harvested data into the
 <code>MetricRegistry</code>:</p>
 </div>
 <div class="listingblock">
@@ -5071,7 +5462,7 @@ to "push" these metrics to some backend.
 </div>
 </div>
 <div class="sect3">
-<h4 id="_timescaledb">1.3.16. TimescaleDB</h4>
+<h4 id="_timescaledb">1.3.17. TimescaleDB</h4>
 <div class="paragraph">
 <p>The Decanter TimescaleDB appender stores the collected data into 
TimescaleDB database.</p>
 </div>
@@ -5086,8 +5477,6 @@ to "push" these metrics to some backend.
 <pre class="CodeRay highlight"><code>docker run -d --name timescaledb -p 
5432:5432 -e POSTGRES_PASSWORD=decanter -e POSTGRES_USER=decanter -e 
POSTGRES_DATABASE=decanter timescale/timescaledb</code></pre>
 </div>
 </div>
-<div class="sect4">
-<h5 id="_timescaledb_appender">TimescaleDB appender</h5>
 <div class="paragraph">
 <p>The <code>decanter-appender-timescaledb</code> feature installs the 
TimescaleDB appender.</p>
 </div>
@@ -5145,8 +5534,8 @@ The table is simple and contains just tw
 </ul>
 </div>
 </div>
-<div class="sect4">
-<h5 id="_websocket_servlet">WebSocket Servlet</h5>
+<div class="sect3">
+<h4 id="_websocket_servlet">1.3.18. WebSocket Servlet</h4>
 <div class="paragraph">
 <p>The <code>decanter-appender-websocket-servlet</code> feature exposes a 
websocket on which clients can register. Then, Decanter will send the collected 
data to the connected clients.</p>
 </div>
@@ -5189,8 +5578,8 @@ ID │ Servlet                  â”�
 </div>
 </div>
 </div>
-<div class="sect4">
-<h5 id="_prometheus_2">Prometheus</h5>
+<div class="sect3">
+<h4 id="_prometheus_2">1.3.19. Prometheus</h4>
 <div class="paragraph">
 <p>The <code>decanter-appender-prometheus</code> feature collects and exposes 
metrics on prometheus:</p>
 </div>
@@ -5272,6 +5661,168 @@ You just have to import <code>io.prometh
 <p>That&#8217;s the only thing you need: your metrics will be available on the 
Decanter Prometheus servlet (again on 
<code>http://localhost:8181/decanter/prometheus</code> by default).</p>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_rest_2">1.3.20. Rest</h4>
+<div class="paragraph">
+<p>Decanter Rest appender send collected data to a remote REST service.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-rest</code> feature installs the Rest 
appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-appender-rest</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature also installs 
<code>etc/org.apache.karaf.decanter.appender.rest.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>###############################
+# Decanter Appender REST Configuration
+###############################
+
+# Mandatory URI where the REST appender connects to
+uri=
+
+#request.method=POST (the REST verb)
+#user= (for basic authentication)
+#password= (for basic authentication)
+#content.type=application/json (the message content type sent)
+#charset=utf-8 (the message charset)
+#header.foo= (HTTP header prefixed with header.)
+#payload.header= (if set the Decanter collected data is sent as HTTP header 
instead of body)
+
+# Marshaller to use (json is recommended)
+marshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>uri</code> is mandatory and contains the location of the Rest service 
to call</p>
+</li>
+<li>
+<p><code>user</code> and <code>password</code> are used if the Rest service 
uses basic authentication</p>
+</li>
+<li>
+<p><code>content.type</code> is the message type sent to the Rest service 
(default is <code>application/json</code>)</p>
+</li>
+<li>
+<p><code>charset</code> is the message encoding (default is 
<code>utf-8</code>)</p>
+</li>
+<li>
+<p><code>header.</code> allows you to add any custom HTTP headers (parameters) 
to the request (prefixed by <code>header.</code>)</p>
+</li>
+<li>
+<p><code>payload.header</code> allows you to use a HTTP header to send the 
collected data instead of directly the "body".</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_hdfs">1.3.21. HDFS</h4>
+<div class="paragraph">
+<p>Decanter HDFS appender stores collected data into a HDFS file.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-hdfs</code> feature installs the HDFS 
appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>karaf@root()&gt; feature:install 
decanter-appender-hdfs</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature also installs 
<code>etc/org.apache.karaf.decanter.appender.hdfs.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>######################################
+# Decanter HDFS Appender Configuration
+######################################
+
+# Optional HDFS configuration
+#hdfs.configuration=
+
+# File mode (create or append)
+#hdfs.mode=create|append|overwrite
+
+# Path location
+#hdfs.path=
+
+# Marshaller
+marshaller.target=(dataFormat=csv)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>hdfs.configuration</code> is the location of the hdfs configuration 
file (core or site)</p>
+</li>
+<li>
+<p><code>hdfs.mode</code> defines the way of populating the file on HDFS 
(creating a new one, appending to an existing one, overwriting an existing 
one)</p>
+</li>
+<li>
+<p><code>hdfs.path</code> defines the location and name of the file on HDFS</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_amazon_s3">1.3.22. Amazon S3</h4>
+<div class="paragraph">
+<p>Decanter Amazon S3 appender stores collected data as objects in a S3 
bucket.</p>
+</div>
+<div class="paragraph">
+<p>The <code>decanter-appender-s3</code> feature installs the S3 appender:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-appender-s3</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature also installs 
<code>etc/org.apache.karaf.decanter.appender.hdfs.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>###############################
+# Decanter Appender S3 Configuration
+###############################
+
+# AWS credentials
+accessKeyId=
+secretKeyId=
+
+# AWS Region (optional)
+#region=
+
+# S3 bucket name
+bucket=
+
+
+# Marshaller to use
+marshaller.target=(dataFormat=json)</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>accessKeyId</code> property is required, containing your AWS access 
key</p>
+</li>
+<li>
+<p><code>secretKeyId</code> property is required, containing your AWS secret 
key</p>
+</li>
+<li>
+<p><code>region</code> property is optional and allows you to define the 
Amazon region to use</p>
+</li>
+<li>
+<p><code>bucket</code> property is required, containing the name of the S3 
bucket where to add objects</p>
+</li>
+</ul>
+</div>
 </div>
 </div>
 <div class="sect2">
@@ -5291,7 +5842,7 @@ the alert rules:</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>rule.my="{'condition':'message:*','level':'ERROR'}</pre>
+<pre>rule.my="{'condition':'message:*','level':'ERROR'}"</pre>
 </div>
 </div>
 <div class="paragraph">
@@ -5376,6 +5927,9 @@ If recoverable, you will have a single a
 <li>
 <p><code>alertTimestamp</code> is the alert timestamp added by the alert 
service</p>
 </li>
+<li>
+<p><code>decanter.collector.name</code> is the name of the origintating 
Decanter collector</p>
+</li>
 </ul>
 </div>
 </div>
@@ -5403,6 +5957,19 @@ If recoverable, you will have a single a
 <div class="paragraph">
 <p>This alerter doesn&#8217;t need any configuration.</p>
 </div>
+<div class="admonitionblock caution">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Caution</div>
+</td>
+<td class="content">
+Use the Alerter Log with caution when also using the Log Collector, 
decanter-collector-log, as you can create a loop. Specifically a
+log event will generate an alert event that will generate a log 
event&#8230;&#8203;..
+</td>
+</tr>
+</table>
+</div>
 </div>
 <div class="sect4">
 <h5 id="_e_mail">E-mail</h5>
@@ -5686,7 +6253,7 @@ data to <code>decanter/process/second</c
 <p>By default, the "merged" event is sent every minute. You can change this 
using the <code>period</code> configuration.</p>
 </div>
 <div class="paragraph">
-<p>You can provisiong 
<code>etc/org.apache.karaf.decanter.processor.aggregate.cfg</code> 
configuration file with:</p>
+<p>You can provision 
<code>etc/org.apache.karaf.decanter.processor.aggregate.cfg</code> 
configuration file with:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -5720,6 +6287,163 @@ target.topics=decanter/process/aggregate
 <p>Then, if a property already exist in the aggregator, its value will be 
overwritten by the new event value received in the aggregator.</p>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_groupby">1.5.3. GroupBy</h4>
+<div class="paragraph">
+<p>This processor "groups" events containing same properties values during a 
period.</p>
+</div>
+<div class="paragraph">
+<p>For instance, you configure the GroupBy processor to group events using 
<code>foo</code> and <code>bar</code> properties. Then you receive
+the following three events:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>first event containing: <code>{ "foo":"foo","bar":"bar","first":"value1" 
}</code></p>
+</li>
+<li>
+<p>second event containing: <code>{ "hello":"world","second":"value2" 
}</code></p>
+</li>
+<li>
+<p>third event containing: <code>{ 
"foo":"foo","bar":"bar","third":"value3"}</code></p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>The groupBy processor will create (and send) one event containing:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>if you choose to "flatten" the properties, the event will contain: <code>{ 
"foo":"foo", "bar":"bar", "first":"value1","third":"value3" }</code></p>
+</li>
+<li>
+<p>if you chosse not to "flatten" the properties, the event will contain: 
<code>{ "events":[ { "foo":"foo","bar":"bar","first":"value1" }, { 
"foo":"foo","bar":"bar","third":"value3" } ] }</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>You can install this processor using the 
<code>decanter-processor-groupby</code> feature:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-processor-groupby</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By default, the "merged" event is sent every minute. You can change this 
using the <code>period</code> configuration.</p>
+</div>
+<div class="paragraph">
+<p>The GroupBy processor is configured via 
<code>etc/org.apache.karaf.decanter.processor.groupby.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter GroupBy processor
+#target.topics=decanter/process/groupby
+
+#
+# Aggregation period in seconds
+#
+#period=60
+
+#
+# List of grouping properties
+#
+#groupBy=first,second
+
+#
+# If true, grouped events properties are flatten (all properties in the event) 
aka Map&lt;String,Object&gt;
+# If false, grouped events properties are inner grouped map aka Map&lt;int, 
Map&lt;String,Object&gt;&gt;
+#
+#flatten=true</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>target.topics</code> property defines the list of Decanter topics 
(separated by <code>,</code>) where the resulting events will be sent.</p>
+</li>
+<li>
+<p>The <code>period</code> property defines the retention period to accumulate 
the incoming events</p>
+</li>
+<li>
+<p>The <code>groupBy</code> property defines the property names (separated by 
<code>,</code>) as grouping term</p>
+</li>
+<li>
+<p>The <code>flatten</code> property defines the way the resulting event will 
be created. If <code>true</code>, all events properties will be store directly 
(flat) in the resulting event. If <code>false</code>, the resulting event will 
contain an array of properties (from the original grouped events).</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_apache_camel">1.5.4. Apache Camel</h4>
+<div class="paragraph">
+<p>It&#8217;s also possible you implement your own event processor using 
Apache Camel.</p>
+</div>
+<div class="paragraph">
+<p>Decanter Camel Processor delegates event processing to your Camel route. 
Your route just has to callback Decanter (on a dedicated Camel endpoint)
+to send the processed event back in the dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>By default, Decanter Camel processor send the events to 
<code>direct-vm:decanter-delegate</code> endpoint, and
+expects the processed event back on 
<code>direct-vm:decanter-callback</code>.</p>
+</div>
+<div class="paragraph">
+<p>The Camel message body is <code>Map&lt;String,Object&gt;</code> (it&#8217;s 
what Decanter is sending into your Camel route and expects on
+the callback endpoint).</p>
+</div>
+<div class="paragraph">
+<p>You can install the Camel processor with the 
<code>decanter-processor-camel</code> feature:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-processor-camel</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also installs 
<code>etc/org.apache.karaf.decanter.processor.camel.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter Camel processor
+#
+
+#
+# Destination dispatcher topics where to send the aggregated events
+#
+#target.topics=decanter/process/camel
+
+#
+# This is the Camel endpoint URI where Decanter is sending the events
+# (using event Map&lt;String, Object&gt; as body)
+#
+#delegate.uri=direct-vm:decanter-delegate
+
+#
+# This is the Camel endpoint URI where user Camel route should call to be 
"back" in Decanter
+# The user Camel route is supposed to do "to uri=[CALLBACK]" with a 
Map&lt;String, Object&gt; body
+# resulting of the route processing.
+# Decanter uses this body to send a new Event to the dispatcher target topics.
+#
+#callback.uri=direct-vm:decanter-callback</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the <code>target.topics</code> property is the list of Decanter dispatcher 
topics (separated by <code>,</code>) where the processor will "forward" the 
processed events.</p>
+</li>
+<li>
+<p>the <code>delegate.uri</code> property is the Camel endpoint URI where 
Decanter Camel Processor will send events (as 
<code>Map&lt;String,Object&gt;</code>). It&#8217;s basically the 
<code>from</code> endpoint of your route.</p>
+</li>
+<li>
+<p>the <code>callback.uri</code> property is the Camel endpoint URI where 
Decanter Camel Processor is waiting from your processed events. Basically, 
it&#8217;s where your route should send processed events (<code>to</code> of 
your route).</p>
+</li>
+</ul>
+</div>
+</div>
 </div>
 </div>
 </div>

Modified: karaf/site/production/manual/decanter/latest-2/html/introduction.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/html/introduction.html?rev=1886565&r1=1886564&r2=1886565&view=diff
==============================================================================
--- karaf/site/production/manual/decanter/latest-2/html/introduction.html 
(original)
+++ karaf/site/production/manual/decanter/latest-2/html/introduction.html Tue 
Feb 16 06:45:00 2021
@@ -2612,16 +2612,30 @@ provides appenders depending on the back
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>karaf@root()&gt; feature:repo-add 
mvn:org.apache.karaf.decanter/apache-karaf-decanter/2.0.0/xml/features</pre>
+<pre>karaf@root()&gt; feature:repo-add 
mvn:org.apache.karaf.decanter/apache-karaf-decanter/2.x.x/xml/features <b 
class="conum">(1)</b></pre>
 </div>
 </div>
+<div class="colist arabic">
+<ol>
+<li>
+<p>Substitute the desired version, i.e. 2.8.0-SNAPSHOT, for 2.x.x</p>
+</li>
+</ol>
+</div>
 <div class="paragraph">
 <p>Or</p>
 </div>
 <div class="listingblock">
 <div class="content">
-<pre>karaf@root()&gt; feature:repo-add decanter 2.0.0</pre>
+<pre>karaf@root()&gt; feature:repo-add decanter 2.x.x <b 
class="conum">(1)</b></pre>
+</div>
 </div>
+<div class="colist arabic">
+<ol>
+<li>
+<p>Substitute the desired version, i.e. 2.8.0-SNAPSHOT, for 2.x.x</p>
+</li>
+</ol>
 </div>
 <div class="paragraph">
 <p>Now, you have to install the collectors, appenders, and eventually alerters 
feature to match your need.</p>
@@ -2630,7 +2644,7 @@ provides appenders depending on the back
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2020-03-30 11:05:30 CEST
+Last updated 2021-01-17 07:32:42 CET
 </div>
 </div>
 </body>

Modified: karaf/site/production/manual/decanter/latest-2/html/processors.html
URL: 
http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/html/processors.html?rev=1886565&r1=1886564&r2=1886565&view=diff
==============================================================================
--- karaf/site/production/manual/decanter/latest-2/html/processors.html 
(original)
+++ karaf/site/production/manual/decanter/latest-2/html/processors.html Tue Feb 
16 06:45:00 2021
@@ -2623,7 +2623,7 @@ data to <code>decanter/process/second</c
 <p>By default, the "merged" event is sent every minute. You can change this 
using the <code>period</code> configuration.</p>
 </div>
 <div class="paragraph">
-<p>You can provisiong 
<code>etc/org.apache.karaf.decanter.processor.aggregate.cfg</code> 
configuration file with:</p>
+<p>You can provision 
<code>etc/org.apache.karaf.decanter.processor.aggregate.cfg</code> 
configuration file with:</p>
 </div>
 <div class="listingblock">
 <div class="content">
@@ -2657,11 +2657,168 @@ target.topics=decanter/process/aggregate
 <p>Then, if a property already exist in the aggregator, its value will be 
overwritten by the new event value received in the aggregator.</p>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_groupby">GroupBy</h4>
+<div class="paragraph">
+<p>This processor "groups" events containing same properties values during a 
period.</p>
+</div>
+<div class="paragraph">
+<p>For instance, you configure the GroupBy processor to group events using 
<code>foo</code> and <code>bar</code> properties. Then you receive
+the following three events:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>first event containing: <code>{ "foo":"foo","bar":"bar","first":"value1" 
}</code></p>
+</li>
+<li>
+<p>second event containing: <code>{ "hello":"world","second":"value2" 
}</code></p>
+</li>
+<li>
+<p>third event containing: <code>{ 
"foo":"foo","bar":"bar","third":"value3"}</code></p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>The groupBy processor will create (and send) one event containing:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>if you choose to "flatten" the properties, the event will contain: <code>{ 
"foo":"foo", "bar":"bar", "first":"value1","third":"value3" }</code></p>
+</li>
+<li>
+<p>if you chosse not to "flatten" the properties, the event will contain: 
<code>{ "events":[ { "foo":"foo","bar":"bar","first":"value1" }, { 
"foo":"foo","bar":"bar","third":"value3" } ] }</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>You can install this processor using the 
<code>decanter-processor-groupby</code> feature:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-processor-groupby</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By default, the "merged" event is sent every minute. You can change this 
using the <code>period</code> configuration.</p>
+</div>
+<div class="paragraph">
+<p>The GroupBy processor is configured via 
<code>etc/org.apache.karaf.decanter.processor.groupby.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter GroupBy processor
+#target.topics=decanter/process/groupby
+
+#
+# Aggregation period in seconds
+#
+#period=60
+
+#
+# List of grouping properties
+#
+#groupBy=first,second
+
+#
+# If true, grouped events properties are flatten (all properties in the event) 
aka Map&lt;String,Object&gt;
+# If false, grouped events properties are inner grouped map aka Map&lt;int, 
Map&lt;String,Object&gt;&gt;
+#
+#flatten=true</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>target.topics</code> property defines the list of Decanter topics 
(separated by <code>,</code>) where the resulting events will be sent.</p>
+</li>
+<li>
+<p>The <code>period</code> property defines the retention period to accumulate 
the incoming events</p>
+</li>
+<li>
+<p>The <code>groupBy</code> property defines the property names (separated by 
<code>,</code>) as grouping term</p>
+</li>
+<li>
+<p>The <code>flatten</code> property defines the way the resulting event will 
be created. If <code>true</code>, all events properties will be store directly 
(flat) in the resulting event. If <code>false</code>, the resulting event will 
contain an array of properties (from the original grouped events).</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_apache_camel">Apache Camel</h4>
+<div class="paragraph">
+<p>It&#8217;s also possible you implement your own event processor using 
Apache Camel.</p>
+</div>
+<div class="paragraph">
+<p>Decanter Camel Processor delegates event processing to your Camel route. 
Your route just has to callback Decanter (on a dedicated Camel endpoint)
+to send the processed event back in the dispatcher.</p>
+</div>
+<div class="paragraph">
+<p>By default, Decanter Camel processor send the events to 
<code>direct-vm:decanter-delegate</code> endpoint, and
+expects the processed event back on 
<code>direct-vm:decanter-callback</code>.</p>
+</div>
+<div class="paragraph">
+<p>The Camel message body is <code>Map&lt;String,Object&gt;</code> (it&#8217;s 
what Decanter is sending into your Camel route and expects on
+the callback endpoint).</p>
+</div>
+<div class="paragraph">
+<p>You can install the Camel processor with the 
<code>decanter-processor-camel</code> feature:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>karaf@root()&gt; feature:install decanter-processor-camel</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This feature also installs 
<code>etc/org.apache.karaf.decanter.processor.camel.cfg</code> configuration 
file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>#
+# Decanter Camel processor
+#
+
+#
+# Destination dispatcher topics where to send the aggregated events
+#
+#target.topics=decanter/process/camel
+
+#
+# This is the Camel endpoint URI where Decanter is sending the events
+# (using event Map&lt;String, Object&gt; as body)
+#
+#delegate.uri=direct-vm:decanter-delegate
+
+#
+# This is the Camel endpoint URI where user Camel route should call to be 
"back" in Decanter
+# The user Camel route is supposed to do "to uri=[CALLBACK]" with a 
Map&lt;String, Object&gt; body
+# resulting of the route processing.
+# Decanter uses this body to send a new Event to the dispatcher target topics.
+#
+#callback.uri=direct-vm:decanter-callback</pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the <code>target.topics</code> property is the list of Decanter dispatcher 
topics (separated by <code>,</code>) where the processor will "forward" the 
processed events.</p>
+</li>
+<li>
+<p>the <code>delegate.uri</code> property is the Camel endpoint URI where 
Decanter Camel Processor will send events (as 
<code>Map&lt;String,Object&gt;</code>). It&#8217;s basically the 
<code>from</code> endpoint of your route.</p>
+</li>
+<li>
+<p>the <code>callback.uri</code> property is the Camel endpoint URI where 
Decanter Camel Processor is waiting from your processed events. Basically, 
it&#8217;s where your route should send processed events (<code>to</code> of 
your route).</p>
+</li>
+</ul>
+</div>
+</div>
 </div>
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2020-04-20 14:54:31 CEST
+Last updated 2020-12-13 07:30:46 CET
 </div>
 </div>
 </body>


Reply via email to