Added: karaf/site/production/manual/decanter/latest-2/pdf/index.html URL: http://svn.apache.org/viewvc/karaf/site/production/manual/decanter/latest-2/pdf/index.html?rev=1877281&view=auto ============================================================================== --- karaf/site/production/manual/decanter/latest-2/pdf/index.html (added) +++ karaf/site/production/manual/decanter/latest-2/pdf/index.html Sat May 2 05:18:46 2020 @@ -0,0 +1,6389 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<meta charset="UTF-8"> +<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<meta name="generator" content="Asciidoctor 1.5.6.1"> +<meta name="author" content="Apache Software Foundation"> +<title>Apache Karaf Decanter 2.x - Documentation</title> +<style> +/* +// Licensed 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. + */ +@import "https://fonts.googleapis.com/css?family=Open+Sans:400,700%7cDroid+Serif:400,700"; + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block +} + +audio, +canvas, +video { + display: inline-block +} + +audio:not([controls]) { + display: none; + height: 0 +} + +script { + display: none !important +} + +html { + font-family: "Droid Serif"; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +a { + background: transparent +} + +a:focus { + outline: thin dotted +} + +a:active, +a:hover { + outline: 0 +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, +strong { + font-weight: bold +} + +dfn { + font-style: italic +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +mark { + background: #ff0; + color: #000 +} + +code, +kbd, +pre, +samp { + font-family: monospace; + font-size: 1em +} + +pre { + white-space: pre-wrap +} + +q { + quotes: "\201C" "\201D" "\2018" "\2019" +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sup { + top: -.5em +} + +sub { + bottom: -.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +figure { + margin: 0 +} + +fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: .35em .625em .75em +} + +legend { + border: 0; + padding: 0 +} + +button, +input, +select, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0 +} + +button, +input { + line-height: normal +} + +button, +select { + text-transform: none +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer +} + +button[disabled], +html input[disabled] { + cursor: default +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0 +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +*, +*::before, +*::after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box +} + +html, +body { + /*font-size: 100%*/ +} + +body { + background: #fff; + color: #333; + padding: 0; + margin: 0; + font-family: "Droid Serif", "DejaVu Serif", serif; + font-size: 14px; + font-style: normal; + line-height: 1.42857143; + position: relative; + cursor: auto; + tab-size: 4; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased +} + +a:hover { + cursor: pointer +} + +img, +object, +embed { + max-width: 100%; + height: auto +} + +object, +embed { + height: 100% +} + +img { + -ms-interpolation-mode: bicubic +} + +.left { + float: left !important +} + +.right { + float: right !important +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-center { + text-align: center !important +} + +.text-justify { + text-align: justify !important +} + +.hide { + display: none +} + +img, +object, +svg { + display: inline-block; + vertical-align: middle +} + +textarea { + height: auto; + min-height: 50px +} + +select { + width: 100% +} + +.center { + margin-left: auto; + margin-right: auto +} + +.stretch { + width: 100% +} + +.subheader, +.admonitionblock td.content>.title, +.audioblock>.title, +.exampleblock>.title, +.imageblock>.title, +.listingblock>.title, +.literalblock>.title, +.stemblock>.title, +.openblock>.title, +.paragraph>.title, +.quoteblock>.title, +table.tableblock>.title, +.verseblock>.title, +.videoblock>.title, +.dlist>.title, +.olist>.title, +.ulist>.title, +.qlist>.title, +.hdlist>.title { + line-height: 1.45; + color: #585ac2; + font-weight: 400; + margin-top: 0; + margin-bottom: .25em +} + +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +#toctitle, +.sidebarblock>.content>.title, +h4, +h5, +h6, +pre, +form, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; + direction: ltr +} + +a { + color: #585ac2; + text-decoration: underline; + line-height: inherit +} + +a:hover, +a:focus { + color: #373997; +} + +a img { + border: none +} + +p { + font-family: inherit; + font-weight: 400; + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + text-rendering: optimizeLegibility +} + +p aside { + font-size: .875em; + line-height: 1.35; + font-style: italic +} + +h1, +h2, +h3, +#toctitle, +.sidebarblock>.content>.title, +h4, +h5, +h6 { + font-family: "Source Sans Pro", "DejaVu Sans", sans-serif; + font-weight: bold; + /*font-style: bold;*/ + color: #303284; + text-rendering: optimizeLegibility; + margin-top: 1em; + margin-bottom: .5em; + line-height: 1.0125em; + text-transform: uppercase; +} + +h1 small, +h2 small, +h3 small, +#toctitle small, +.sidebarblock>.content>.title small, +h4 small, +h5 small, +h6 small { + font-size: 60%; + color: #303284; + line-height: 0 +} + +h1 { + font-size: 2.125em +} + +h2 { + font-size: 1.6875em +} + +h3, +#toctitle, +.sidebarblock>.content>.title { + font-size: 1.375em +} + +h4, +h5 { + font-size: 1.125em +} + +h6 { + font-size: 1em +} + +hr { + border: solid #dddddd; + border-width: 1px 0 0; + clear: both; + margin: 1.25em 0 1.1875em; + height: 0 +} + +em, +i { + font-style: italic; + line-height: inherit +} + +strong, +b { + font-weight: bold; + line-height: inherit +} + +small { + font-size: 60%; + line-height: inherit +} + +code { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + font-weight: 400; + color: #585ac2; +} + +ul, +ol, +dl { + font-size: 1em; + line-height: 1.6; + margin-bottom: 1.25em; + list-style-position: outside; + font-family: inherit +} + +ul, +ol { + margin-left: 1.5em +} + +ul li ul, +ul li ol { + margin-left: 1.25em; + margin-bottom: 0; + font-size: 1em +} + +ul.square li ul, +ul.circle li ul, +ul.disc li ul { + list-style: inherit +} + +ul.square { + list-style-type: square +} + +ul.circle { + list-style-type: circle +} + +ul.disc { + list-style-type: disc +} + +ol li ul, +ol li ol { + margin-left: 1.25em; + margin-bottom: 0 +} + +dl dt { + margin-bottom: .3125em; + font-weight: bold +} + +dl dd { + margin-bottom: 1.25em +} + +abbr, +acronym { + text-transform: uppercase; + font-size: 90%; + color: rgba(0, 0, 0, .8); + border-bottom: 1px dotted #ddd; + cursor: help +} + +abbr { + text-transform: none +} + +blockquote { + margin: 0 0 1.25em; + padding: .5625em 1.25em 0 1.1875em; + border-left: 1px solid #ddd +} + +blockquote cite { + display: block; + font-size: .9375em; + color: rgba(0, 0, 0, .6) +} + +blockquote cite::before { + content: "\2014 \0020" +} + +blockquote cite a, +blockquote cite a:visited { + color: rgba(0, 0, 0, .6) +} + +blockquote, +blockquote p { + line-height: 1.6; + color: rgba(0, 0, 0, .85) +} + +@media screen and (min-width:768px) { + h1, + h2, + h3, + #toctitle, + .sidebarblock>.content>.title, + h4, + h5, + h6 { + line-height: 1.2 + } + + h1 { + font-size: 2.75em + } + + h2 { + font-size: 2.3125em + } + + h3, + #toctitle, + .sidebarblock>.content>.title { + font-size: 1.6875em + } + + h4 { + font-size: 1.4375em + } + +} + +table { + background: #fff; + margin-bottom: 1.25em; + border: solid 1px #dddddd; +} + +table thead, +table tfoot { + background: #f7f8f7 +} + +table thead tr th, +table thead tr td, +table tfoot tr th, +table tfoot tr td { + padding: .5em .625em .625em; + font-size: inherit; + color: rgba(0, 0, 0, .8); + text-align: left +} + +table tr th, +table tr td { + padding: .5625em .625em; + font-size: inherit; + color: rgba(0, 0, 0, .8) +} + +table tr.even, +table tr.alt, +table tr:nth-of-type(even) { + background: #f8f8f7 +} + +table thead tr th, +table tfoot tr th, +table tbody tr td, +table tr td, +table tfoot tr td { + display: table-cell; + line-height: 1.6 +} + +h1, +h2, +h3, +#toctitle, +.sidebarblock>.content>.title, +h4, +h5, +h6 { + line-height: 1.2; + word-spacing: -.05em +} + +h1 strong, +h2 strong, +h3 strong, +#toctitle strong, +.sidebarblock>.content>.title strong, +h4 strong, +h5 strong, +h6 strong { + font-weight: 400 +} + +.clearfix::before, +.clearfix::after, +.float-group::before, +.float-group::after { + content: " "; + display: table +} + +.clearfix::after, +.float-group::after { + clear: both +} + +*:not(pre)>code { + font-size: .9375em; + font-style: normal !important; + letter-spacing: 0; + padding: .1em .5ex; + word-spacing: -.15em; + background-color: #f7f7f8; + -webkit-border-radius: 4px; + border-radius: 4px; + line-height: 1.45; + text-rendering: optimizeSpeed; + word-wrap: break-word +} + +*:not(pre)>code.nobreak { + word-wrap: normal +} + +*:not(pre)>code.nowrap { + white-space: nowrap +} + +pre, +pre>code { + line-height: 1.45; + color: #585ac2; + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + font-weight: 400; + text-rendering: optimizeSpeed +} + +em em { + font-style: normal +} + +strong strong { + font-weight: 400 +} + +.keyseq { + color: rgba(51, 51, 51, .8) +} + +kbd { + font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; + display: inline-block; + color: rgba(0, 0, 0, .8); + font-size: .65em; + line-height: 1.45; + background-color: #f7f7f7; + border: 1px solid #dddddd; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em white inset; + box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset; + margin: 0 .15em; + padding: .2em .5em; + vertical-align: middle; + position: relative; + top: -.1em; + white-space: nowrap +} + +.keyseq kbd:first-child { + margin-left: 0 +} + +.keyseq kbd:last-child { + margin-right: 0 +} + +.menuseq, +.menuref { + color: #000 +} + +.menuseq b:not(.caret),.menuref { + font-weight: inherit +} + +.menuseq { + word-spacing: -.02em +} + +.menuseq b.caret { + font-size: 1.25em; + line-height: .8 +} + +.menuseq i.caret { + font-weight: bold; + text-align: center; + width: .45em +} + +b.button::before, +b.button::after { + position: relative; + top: -1px; + font-weight: 400 +} + +b.button::before { + content: "["; + padding: 0 3px 0 2px +} + +b.button::after { + content: "]"; + padding: 0 2px 0 3px +} + +p a>code:hover { + color: #585ac2; +} + +#header, +#content, +#footnotes, +#footer { + width: 100%; + margin-left: auto; + margin-right: auto; + margin-top: 0; + margin-bottom: 0; + max-width: 62.5em; + *zoom: 1; + position: relative; + padding-left: .9375em; + padding-right: .9375em +} + +#header::before, +#header::after, +#content::before, +#content::after, +#footnotes::before, +#footnotes::after, +#footer::before, +#footer::after { + content: " "; + display: table +} + +#header::after, +#content::after, +#footnotes::after, +#footer::after { + clear: both +} + +#content { + margin-top: 1.25em +} + +#content::before { + content: none +} + +#header>h1:first-child { + color: #303284; + margin-top: 2.25rem; + margin-bottom: 0 +} + +#header>h1:first-child+#toc { + margin-top: 8px; + border-top: 1px solid #dddddd +} + +#header>h1:only-child, +body.toc2 #header>h1:nth-last-child(2) { + border-bottom: 1px solid #dddddd; + padding-bottom: 8px +} + +#header .details { + border-bottom: 1px solid #dddddd; + line-height: 1.45; + padding-top: .25em; + padding-bottom: .25em; + padding-left: .25em; + color: rgba(0, 0, 0, .6); + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-flow: row wrap; + -webkit-flex-flow: row wrap; + flex-flow: row wrap +} + +#header .details span:first-child { + margin-left: -.125em +} + +#header .details span.email a { + color: rgba(0, 0, 0, .85) +} + +#header .details br { + display: none +} + +#header .details br+span::before { + content: "\00a0\2013\00a0" +} + +#header .details br+span.author::before { + content: "\00a0\22c5\00a0"; + color: rgba(0, 0, 0, .85) +} + +#header .details br+span#revremark::before { + content: "\00a0|\00a0" +} + +#header #revnumber { + text-transform: capitalize +} + +#header #revnumber::after { + content: "\00a0" +} + +#content>h1:first-child:not([class]) { + color: rgba(0, 0, 0, .85); + border-bottom: 1px solid #dddddd +; + padding-bottom: 8px; + margin-top: 0; + padding-top: 1rem; + margin-bottom: 1.25rem +} + +#toc { + border-bottom: 1px solid #dddddd; + padding-bottom: .5em +} + +#toc>ul { + margin-left: .125em +} + +#toc ul.sectlevel0>li>a { + font-style: italic +} + +#toc ul.sectlevel0 ul.sectlevel1 { + margin: .5em 0 +} + +#toc ul { + font-family: "Droid Serif", "DejaVu Sans", sans-serif; + list-style-type: none +} + +#toc li { + line-height: 1.3334; + margin-top: .3334em +} + +#toc a { + text-decoration: none +} + +#toc a:active { + text-decoration: underline +} + +#toctitle { + color: #303284; + font-size: 1.2em +} + +@media screen and (min-width:768px) { + #toctitle { + font-size: 1.375em + } + + body.toc2 { + padding-left: 15em; + padding-right: 0 + } + + #toc.toc2 { + margin-top: 0 !important; + background-color: #eee; + position: fixed; + width: 15em; + left: 0; + top: 0; + border-right: 1px solid #dddddd; + border-top-width: 0 !important; + border-bottom-width: 0 !important; + z-index: 1000; + padding: 1.25em 1em; + height: 100%; + overflow: auto + } + + #toc.toc2 #toctitle { + margin-top: 0; + margin-bottom: .8rem; + font-size: 1.2em + } + + #toc.toc2>ul { + font-size: .9em; + margin-bottom: 0 + } + + #toc.toc2 ul ul { + margin-left: 0; + padding-left: 1em + } + + #toc.toc2 ul.sectlevel0 ul.sectlevel1 { + padding-left: 0; + margin-top: .5em; + margin-bottom: .5em + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 15em + } + + body.toc2.toc-right #toc.toc2 { + border-right-width: 0; + border-left: 1px solid #dddddd; + left: auto; + right: 0 + } + +} + +@media screen and (min-width:1280px) { + body.toc2 { + padding-left: 20em; + padding-right: 0 + } + + #toc.toc2 { + width: 20em + } + + #toc.toc2 #toctitle { + font-size: 1.375em + } + + #toc.toc2>ul { + font-size: .95em + } + + #toc.toc2 ul ul { + padding-left: 1.25em + } + + body.toc2.toc-right { + padding-left: 0; + padding-right: 20em + } + +} + +#content #toc { + border-style: solid; + border-width: 1px; + border-color: #dddddd; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px +} + +#content #toc>:first-child { + margin-top: 0 +} + +#content #toc>:last-child { + margin-bottom: 0 +} + +#footer { + max-width: 100%; + background-color: #303284; + padding: 1.25em +} + +#footer-text { + color: #fff; + line-height: 1.44 +} + +#content { + margin-bottom: .625em +} + +.sect1 { + padding-bottom: .625em +} + +@media screen and (min-width:768px) { + #content { + margin-bottom: 1.25em + } + + .sect1 { + padding-bottom: 1.25em + } + +} + +.sect1:last-child { + padding-bottom: 0 +} + +.sect1+.sect1 { + border-top: 1px solid #dddddd; +} + +#content h1>a.anchor, +h2>a.anchor, +h3>a.anchor, +#toctitle>a.anchor, +.sidebarblock>.content>.title>a.anchor, +h4>a.anchor, +h5>a.anchor, +h6>a.anchor { + position: absolute; + z-index: 1001; + width: 1.5ex; + margin-left: -1.5ex; + display: block; + text-decoration: none !important; + visibility: hidden; + text-align: center; + font-weight: 400 +} + +#content h1>a.anchor::before, +h2>a.anchor::before, +h3>a.anchor::before, +#toctitle>a.anchor::before, +.sidebarblock>.content>.title>a.anchor::before, +h4>a.anchor::before, +h5>a.anchor::before, +h6>a.anchor::before { + content: "\00A7"; + font-size: .85em; + display: block; + padding-top: .1em +} + +#content h1:hover>a.anchor, +#content h1>a.anchor:hover, +h2:hover>a.anchor, +h2>a.anchor:hover, +h3:hover>a.anchor, +#toctitle:hover>a.anchor, +.sidebarblock>.content>.title:hover>a.anchor, +h3>a.anchor:hover, +#toctitle>a.anchor:hover, +.sidebarblock>.content>.title>a.anchor:hover, +h4:hover>a.anchor, +h4>a.anchor:hover, +h5:hover>a.anchor, +h5>a.anchor:hover, +h6:hover>a.anchor, +h6>a.anchor:hover { + visibility: visible +} + +#content h1>a.link, +h2>a.link, +h3>a.link, +#toctitle>a.link, +.sidebarblock>.content>.title>a.link, +h4>a.link, +h5>a.link, +h6>a.link { + color: #ba3925; + text-decoration: none +} + +#content h1>a.link:hover, +h2>a.link:hover, +h3>a.link:hover, +#toctitle>a.link:hover, +.sidebarblock>.content>.title>a.link:hover, +h4>a.link:hover, +h5>a.link:hover, +h6>a.link:hover { + color: #a53221 +} + +.audioblock, +.imageblock, +.literalblock, +.listingblock, +.stemblock, +.videoblock { + margin-bottom: 1.25em +} + +.admonitionblock td.content>.title, +.audioblock>.title, +.exampleblock>.title, +.imageblock>.title, +.listingblock>.title, +.literalblock>.title, +.stemblock>.title, +.openblock>.title, +.paragraph>.title, +.quoteblock>.title, +table.tableblock>.title, +.verseblock>.title, +.videoblock>.title, +.dlist>.title, +.olist>.title, +.ulist>.title, +.qlist>.title, +.hdlist>.title { + text-rendering: optimizeLegibility; + text-align: left; + font-family: "Droid Serif", "DejaVu Serif", serif; + font-size: 1rem; + font-style: italic +} + +table.tableblock.fit-content>caption.title { + white-space: nowrap; + width: 0 +} + +.paragraph.lead>p, +#preamble>.sectionbody>[class="paragraph"]:first-of-type p { + font-size: 1.21875em; + line-height: 1.6; + color: rgba(0, 0, 0, .85) +} + +table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p { + font-size: inherit +} + +.admonitionblock>table { + border-collapse: separate; + border: 0; + background: none; + width: 100% +} + +.admonitionblock>table td.icon { + text-align: center; + width: 80px +} + +.admonitionblock>table td.icon img { + max-width: none +} + +.admonitionblock>table td.icon .title { + font-weight: bold; + font-family: "Source Sans Pro", "DejaVu Sans", sans-serif; + text-transform: uppercase +} + +.admonitionblock>table td.content { + padding-left: 1.125em; + padding-right: 1.25em; + border-left: 1px solid #dddddd; + color: rgba(0, 0, 0, .6) +} + +.admonitionblock>table td.content>:last-child>:last-child { + margin-bottom: 0 +} + +.exampleblock>.content { + border-style: solid; + border-width: 1px; + border-color: #dddddd; + margin-bottom: 1.25em; + padding: 1.25em; + background: #fff; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.exampleblock>.content>:first-child { + margin-top: 0 +} + +.exampleblock>.content>:last-child { + margin-bottom: 0 +} + +.sidebarblock { + border-style: solid; + border-width: 1px; + border-color: #dddddd; + margin-bottom: 1.25em; + padding: 1.25em; + background: #f8f8f7; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.sidebarblock>:first-child { + margin-top: 0 +} + +.sidebarblock>:last-child { + margin-bottom: 0 +} + +.sidebarblock>.content>.title { + color: #303284; + margin-top: 0; + text-align: center +} + +.exampleblock>.content>:last-child>:last-child, +.exampleblock>.content .olist>ol>li:last-child>:last-child, +.exampleblock>.content .ulist>ul>li:last-child>:last-child, +.exampleblock>.content .qlist>ol>li:last-child>:last-child, +.sidebarblock>.content>:last-child>:last-child, +.sidebarblock>.content .olist>ol>li:last-child>:last-child, +.sidebarblock>.content .ulist>ul>li:last-child>:last-child, +.sidebarblock>.content .qlist>ol>li:last-child>:last-child { + margin-bottom: 0 +} + +.literalblock pre, +.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint { + background: #f7f7f8 +} + +.sidebarblock .literalblock pre, +.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint { + background: #f2f1f1 +} + +.literalblock pre, +.literalblock pre[class], +.listingblock pre, +.listingblock pre[class] { + -webkit-border-radius: 4px; + border-radius: 4px; + word-wrap: break-word; + padding: 1em; + font-size: .8125em +} + +.literalblock pre.nowrap, +.literalblock pre[class].nowrap, +.listingblock pre.nowrap, +.listingblock pre[class].nowrap { + overflow-x: auto; + white-space: pre; + word-wrap: normal +} + +@media screen and (min-width:768px) { + .literalblock pre, + .literalblock pre[class], + .listingblock pre, + .listingblock pre[class] { + font-size: .90625em + } + +} + +@media screen and (min-width:1280px) { + .literalblock pre, + .literalblock pre[class], + .listingblock pre, + .listingblock pre[class] { + font-size: 1em + } + +} + +.literalblock.output pre { + color: #f7f7f8; + background-color: rgba(0, 0, 0, .9) +} + +.listingblock pre.highlightjs { + padding: 0 +} + +.listingblock pre.highlightjs>code { + padding: 1em; + -webkit-border-radius: 4px; + border-radius: 4px +} + +.listingblock pre.prettyprint { + border-width: 0 +} + +.listingblock>.content { + position: relative +} + +.listingblock code[data-lang]::before { + display: none; + content: attr(data-lang); + position: absolute; + font-size: .75em; + top: .425rem; + right: .5rem; + line-height: 1; + text-transform: uppercase; + color: #999 +} + +.listingblock:hover code[data-lang]::before { + display: block +} + +.listingblock.terminal pre .command::before { + content: attr(data-prompt); + padding-right: .5em; + color: #999 +} + +.listingblock.terminal pre .command:not([data-prompt])::before { + content: "$" +} + +table.pyhltable { + border-collapse: separate; + border: 0; + margin-bottom: 0; + background: none +} + +table.pyhltable td { + vertical-align: top; + padding-top: 0; + padding-bottom: 0; + line-height: 1.45 +} + +table.pyhltable td.code { + padding-left: .75em; + padding-right: 0 +} + +pre.pygments .lineno, +table.pyhltable td:not(.code) { + color: #999; + padding-left: 0; + padding-right: .5em; + border-right: 1px solid #dddddd; +} + +pre.pygments .lineno { + display: inline-block; + margin-right: .25em +} + +table.pyhltable .linenodiv { + background: none !important; + padding-right: 0 !important +} + +.quoteblock { + margin: 0 1em 1.25em 1.5em; + display: table +} + +.quoteblock>.title { + margin-left: -1.5em; + margin-bottom: .75em +} + +.quoteblock blockquote, +.quoteblock blockquote p { + color: rgba(0, 0, 0, .85); + font-size: 1.05rem; + line-height: 1.75; + word-spacing: .1em; + letter-spacing: 0; + font-style: italic; + text-align: justify +} + +.quoteblock blockquote { + margin: 0; + padding: 0; + border: 0 +} + +.quoteblock blockquote::before { + content: "\201c"; + float: left; + font-size: 2.75em; + font-weight: bold; + line-height: .6em; + margin-left: -.6em; + color: #303284; + text-shadow: 0 1px 2px rgba(0, 0, 0, .1) +} + +.quoteblock blockquote>.paragraph:last-child p { + margin-bottom: 0 +} + +.quoteblock .attribution { + margin-top: .5em; + margin-right: .5ex; + text-align: right +} + +.quoteblock .quoteblock { + margin-left: 0; + margin-right: 0; + padding: .5em 0; + border-left: 3px solid rgba(0, 0, 0, .6) +} + +.quoteblock .quoteblock blockquote { + padding: 0 0 0 .75em +} + +.quoteblock .quoteblock blockquote::before { + display: none +} + +.verseblock { + margin: 0 1em 1.25em +} + +.verseblock pre { + font-family: "Source Sans Pro", "DejaVu Sans", sans; + font-size: 1.15rem; + color: rgba(0, 0, 0, .85); + font-weight: 300; + text-rendering: optimizeLegibility +} + +.verseblock pre strong { + font-weight: 400 +} + +.verseblock .attribution { + margin-top: 1.25rem; + margin-left: .5ex +} + +.quoteblock .attribution, +.verseblock .attribution { + font-size: .9375em; + line-height: 1.45; + font-style: italic +} + +.quoteblock .attribution br, +.verseblock .attribution br { + display: none +} + +.quoteblock .attribution cite, +.verseblock .attribution cite { + display: block; + letter-spacing: -.025em; + color: rgba(0, 0, 0, .6) +} + +.quoteblock.abstract { + margin: 0 1em 1.25em; + display: block +} + +.quoteblock.abstract>.title { + margin: 0 0 .375em; + font-size: 1.15em; + text-align: center +} + +.quoteblock.abstract blockquote, +.quoteblock.abstract blockquote p { + word-spacing: 0; + line-height: 1.6 +} + +.quoteblock.abstract blockquote::before, +.quoteblock.abstract p::before { + display: none +} + +table.tableblock { + max-width: 100%; + border-collapse: separate +} + +p.tableblock:last-child { + margin-bottom: 0 +} + +td.tableblock>.content { + margin-bottom: -1.25em +} + +table.tableblock, +th.tableblock, +td.tableblock { + border: 0 solid #dddddd; +} + +table.grid-all>thead>tr>.tableblock, +table.grid-all>tbody>tr>.tableblock { + border-width: 0 1px 1px 0 +} + +table.grid-all>tfoot>tr>.tableblock { + border-width: 1px 1px 0 0 +} + +table.grid-cols>*>tr>.tableblock { + border-width: 0 1px 0 0 +} + +table.grid-rows>thead>tr>.tableblock, +table.grid-rows>tbody>tr>.tableblock { + border-width: 0 0 1px +} + +table.grid-rows>tfoot>tr>.tableblock { + border-width: 1px 0 0 +} + +table.grid-all>*>tr>.tableblock:last-child, +table.grid-cols>*>tr>.tableblock:last-child { + border-right-width: 0 +} + +table.grid-all>tbody>tr:last-child>.tableblock, +table.grid-all>thead:last-child>tr>.tableblock, +table.grid-rows>tbody>tr:last-child>.tableblock, +table.grid-rows>thead:last-child>tr>.tableblock { + border-bottom-width: 0 +} + +table.frame-all { + border-width: 1px +} + +table.frame-sides { + border-width: 0 1px +} + +table.frame-topbot, +table.frame-ends { + border-width: 1px 0 +} + +table.stripes-all tr, +table.stripes-odd tr:nth-of-type(odd) { + background: #f8f8f7 +} + +table.stripes-none tr, +table.stripes-odd tr:nth-of-type(even) { + background: none +} + +th.halign-left, +td.halign-left { + text-align: left +} + +th.halign-right, +td.halign-right { + text-align: right +} + +th.halign-center, +td.halign-center { + text-align: center +} + +th.valign-top, +td.valign-top { + vertical-align: top +} + +th.valign-bottom, +td.valign-bottom { + vertical-align: bottom +} + +th.valign-middle, +td.valign-middle { + vertical-align: middle +} + +table thead th, +table tfoot th { + font-weight: bold +} + +tbody tr th { + display: table-cell; + line-height: 1.6; + background: #f7f8f7 +} + +tbody tr th, +tbody tr th p, +tfoot tr th, +tfoot tr th p { + color: rgba(0, 0, 0, .8); + font-weight: bold +} + +p.tableblock>code:only-child { + background: none; + padding: 0 +} + +p.tableblock { + font-size: 1em +} + +td>div.verse { + white-space: pre +} + +ol { + margin-left: 1.75em +} + +ul li ol { + margin-left: 1.5em +} + +dl dd { + margin-left: 1.125em +} + +dl dd:last-child, +dl dd:last-child>:last-child { + margin-bottom: 0 +} + +ol>li p, +ul>li p, +ul dd, +ol dd, +.olist .olist, +.ulist .ulist, +.ulist .olist, +.olist .ulist { + margin-bottom: .625em +} + +ul.checklist, +ul.none, +ol.none, +ul.no-bullet, +ol.no-bullet, +ol.unnumbered, +ul.unstyled, +ol.unstyled { + list-style-type: none +} + +ul.no-bullet, +ol.no-bullet, +ol.unnumbered { + margin-left: .625em +} + +ul.unstyled, +ol.unstyled { + margin-left: 0 +} + +ul.checklist { + margin-left: .625em +} + +ul.checklist li>p:first-child>.fa-square-o:first-child, +ul.checklist li>p:first-child>.fa-check-square-o:first-child { + width: 1.25em; + font-size: .8em; + position: relative; + bottom: .125em +} + +ul.checklist li>p:first-child>input[type="checkbox"]:first-child { + margin-right: .25em +} + +ul.inline { + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -ms-flex-flow: row wrap; + -webkit-flex-flow: row wrap; + flex-flow: row wrap; + list-style: none; + margin: 0 0 .625em -1.25em +} + +ul.inline>li { + margin-left: 1.25em +} + +.unstyled dl dt { + font-weight: 400; + font-style: normal +} + +ol.arabic { + list-style-type: decimal +} + +ol.decimal { + list-style-type: decimal-leading-zero +} + +ol.loweralpha { + list-style-type: lower-alpha +} + +ol.upperalpha { + list-style-type: upper-alpha +} + +ol.lowerroman { + list-style-type: lower-roman +} + +ol.upperroman { + list-style-type: upper-roman +} + +ol.lowergreek { + list-style-type: lower-greek +} + +.hdlist>table, +.colist>table { + border: 0; + background: none +} + +.hdlist>table>tbody>tr, +.colist>table>tbody>tr { + background: none +} + +td.hdlist1, +td.hdlist2 { + vertical-align: top; + padding: 0 .625em +} + +td.hdlist1 { + font-weight: bold; + padding-bottom: 1.25em +} + +.literalblock+.colist, +.listingblock+.colist { + margin-top: -.5em +} + +.colist td:not([class]):first-child { + padding: .4em .75em 0; + line-height: 1; + vertical-align: top +} + +.colist td:not([class]):first-child img { + max-width: none +} + +.colist td:not([class]):last-child { + padding: .25em 0 +} + +.thumb, +.th { + line-height: 0; + display: inline-block; + border: solid 4px #fff; + -webkit-box-shadow: 0 0 0 1px #ddd; + box-shadow: 0 0 0 1px #ddd +} + +.imageblock.left, +.imageblock[style*="float:left"] { + margin: .25em .625em 1.25em 0 +} + +.imageblock.right, +.imageblock[style*="float:right"] { + margin: .25em 0 1.25em .625em +} + +.imageblock>.title { + margin-bottom: 0 +} + +.imageblock.thumb, +.imageblock.th { + border-width: 6px +} + +.imageblock.thumb>.title, +.imageblock.th>.title { + padding: 0 .125em +} + +.image.left, +.image.right { + margin-top: .25em; + margin-bottom: .25em; + display: inline-block; + line-height: 0 +} + +.image.left { + margin-right: .625em +} + +.image.right { + margin-left: .625em +} + +a.image { + text-decoration: none; + display: inline-block +} + +a.image object { + pointer-events: none +} + +sup.footnote, +sup.footnoteref { + font-size: .875em; + position: static; + vertical-align: super +} + +sup.footnote a, +sup.footnoteref a { + text-decoration: none +} + +sup.footnote a:active, +sup.footnoteref a:active { + text-decoration: underline +} + +#footnotes { + padding-top: .75em; + padding-bottom: .75em; + margin-bottom: .625em +} + +#footnotes hr { + width: 20%; + min-width: 6.25em; + margin: -.25em 0 .75em; + border-width: 1px 0 0 +} + +#footnotes .footnote { + padding: 0 .375em 0 .225em; + line-height: 1.3334; + font-size: .875em; + margin-left: 1.2em; + margin-bottom: .2em +} + +#footnotes .footnote a:first-of-type { + font-weight: bold; + text-decoration: none; + margin-left: -1.05em +} + +#footnotes .footnote:last-of-type { + margin-bottom: 0 +} + +#content #footnotes { + margin-top: -.625em; + margin-bottom: 0; + padding: .75em 0 +} + +.gist .file-data>table { + border: 0; + background: #fff; + width: 100%; + margin-bottom: 0 +} + +.gist .file-data>table td.line-data { + width: 99% +} + +div.unbreakable { + page-break-inside: avoid +} + +.big { + font-size: larger +} + +.small { + font-size: smaller +} + +.underline { + text-decoration: underline +} + +.overline { + text-decoration: overline +} + +.line-through { + text-decoration: line-through +} + +.aqua { + color: #00bfbf +} + +.aqua-background { + background-color: #00fafa +} + +.black { + color: #000 +} + +.black-background { + background-color: #000 +} + +.blue { + color: #0000bf +} + +.blue-background { + background-color: #0000fa +} + +.fuchsia { + color: #bf00bf +} + +.fuchsia-background { + background-color: #fa00fa +} + +.gray { + color: #606060 +} + +.gray-background { + background-color: #7d7d7d +} + +.green { + color: #006000 +} + +.green-background { + background-color: #007d00 +} + +.lime { + color: #00bf00 +} + +.lime-background { + background-color: #00fa00 +} + +.maroon { + color: #600000 +} + +.maroon-background { + background-color: #7d0000 +} + +.navy { + color: #000060 +} + +.navy-background { + background-color: #00007d +} + +.olive { + color: #606000 +} + +.olive-background { + background-color: #7d7d00 +} + +.purple { + color: #600060 +} + +.purple-background { + background-color: #7d007d +} + +.red { + color: #bf0000 +} + +.red-background { + background-color: #fa0000 +} + +.silver { + color: #909090 +} + +.silver-background { + background-color: #bcbcbc +} + +.teal { + color: #006060 +} + +.teal-background { + background-color: #007d7d +} + +.white { + color: #bfbfbf +} + +.white-background { + background-color: #fafafa +} + +.yellow { + color: #bfbf00 +} + +.yellow-background { + background-color: #fafa00 +} + +span.icon>.fa { + cursor: default +} + +a span.icon>.fa { + cursor: inherit +} + +.admonitionblock td.icon [class^="fa icon-"] { + font-size: 2.5em; + text-shadow: 1px 1px 2px rgba(0, 0, 0, .5); + cursor: default +} + +.admonitionblock td.icon .icon-note::before { + content: "\f05a"; + color: #19407c +} + +.admonitionblock td.icon .icon-tip::before { + content: "\f0eb"; + text-shadow: 1px 1px 2px rgba(155, 155, 0, .8); + color: #111 +} + +.admonitionblock td.icon .icon-warning::before { + content: "\f071"; + color: #bf6900 +} + +.admonitionblock td.icon .icon-caution::before { + content: "\f06d"; + color: #bf3400 +} + +.admonitionblock td.icon .icon-important::before { + content: "\f06a"; + color: #bf0000 +} + +.conum[data-value] { + display: inline-block; + color: #fff !important; + background-color: rgba(0, 0, 0, .8); + -webkit-border-radius: 100px; + border-radius: 100px; + text-align: center; + font-size: .75em; + width: 1.67em; + height: 1.67em; + line-height: 1.67em; + font-family: "Source Sans Pro", "DejaVu Sans", sans-serif; + font-style: normal; + font-weight: bold +} + +.conum[data-value] * { + color: #fff !important +} + +.conum[data-value]+b { + display: none +} + +.conum[data-value]::after { + content: attr(data-value) +} + +pre .conum[data-value] { + position: relative; + top: -.125em +} + +b.conum * { + color: inherit !important +} + +.conum:not([data-value]):empty { + display: none +} + +dt, +th.tableblock, +td.content, +div.footnote { + text-rendering: optimizeLegibility +} + +h1, +h2, +p, +td.content, +span.alt { + letter-spacing: -.01em +} + +p strong, +td.content strong, +div.footnote strong { + letter-spacing: -.005em +} + +p, +blockquote, +dt, +td.content, +span.alt { + /*font-size: 1.0625rem*/ +} + +p { + margin-bottom: 1.25rem +} + +.sidebarblock p, +.sidebarblock dt, +.sidebarblock td.content, +p.tableblock { + font-size: 1em +} + +.exampleblock>.content { + background-color: #fffef7; + border-color: #dddddd; + -webkit-box-shadow: 0 1px 4px #e0e0dc; + box-shadow: 0 1px 4px #e0e0dc +} + +.print-only { + display: none !important +} + +@page { + margin: 1.25cm .75cm +} + +@media print { + * { + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important + } + + html { + font-size: 80% + } + + a { + color: inherit !important; + text-decoration: underline !important + } + + a.bare, + a[href^="#"], + a[href^="mailto:"] { + text-decoration: none !important + } + + a[href^="http:"]:not(.bare)::after, + a[href^="https:"]:not(.bare)::after { + content: "("attr(href) ")"; + display: inline-block; + font-size: .875em; + padding-left: .25em + } + + abbr[title]::after { + content: " ("attr(title) ")" + } + + pre, + blockquote, + tr, + img, + object, + svg { + page-break-inside: avoid + } + + thead { + display: table-header-group + } + + svg { + max-width: 100% + } + + p, + blockquote, + dt, + td.content { + font-size: 1em; + orphans: 3; + widows: 3 + } + + h2, + h3, + #toctitle, + .sidebarblock>.content>.title { + page-break-after: avoid + } + + #toc, + .sidebarblock, + .exampleblock>.content { + background: none !important + } + + #toc { + border-bottom: 1px solid #dddddd !important; + padding-bottom: 0 !important + } + + body.book #header { + text-align: center + } + + body.book #header>h1:first-child { + border: 0 !important; + margin: 2.5em 0 1em + } + + body.book #header .details { + border: 0 !important; + display: block; + padding: 0 !important + } + + body.book #header .details span:first-child { + margin-left: 0 !important + } + + body.book #header .details br { + display: block + } + + body.book #header .details br+span::before { + content: none !important + } + + body.book #toc { + border: 0 !important; + text-align: left !important; + padding: 0 !important; + margin: 0 !important + } + + body.book #toc, + body.book #preamble, + body.book h1.sect0, + body.book .sect1>h2 { + page-break-before: always + } + + .listingblock code[data-lang]::before { + display: block + } + + #footer { + padding: 0 .9375em + } + + .hide-on-print { + display: none !important + } + + .print-only { + display: block !important + } + + .hide-for-print { + display: none !important + } + + .show-for-print { + display: inherit !important + } + +} + +@media print, amzn-kf8 { + #header>h1:first-child { + margin-top: 1.25rem + } + + .sect1 { + padding: 0 !important + } + + .sect1+.sect1 { + border: 0 + } + + #footer { + background: none + } + + #footer-text { + color: rgba(0, 0, 0, .6); + font-size: .9em + } + +} + +@media amzn-kf8 { + #header, + #content, + #footnotes, + #footer { + padding: 0 + } + +} +</style> +<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css"> +<style> +/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */ +/*pre.CodeRay {background-color:#f7f7f8;}*/ +.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em} +.CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)} +.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)} +table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none} +table.CodeRay td{vertical-align: top;line-height:1.45} +table.CodeRay td.line-numbers{text-align:right} +table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)} +table.CodeRay td.code{padding:0 0 0 .5em} +table.CodeRay td.code>pre{padding:0} +.CodeRay .debug{color:#fff !important;background:#000080 !important} +.CodeRay .annotation{color:#007} +.CodeRay .attribute-name{color:#000080} +.CodeRay .attribute-value{color:#700} +.CodeRay .binary{color:#509} +.CodeRay .comment{color:#998;font-style:italic} +.CodeRay .char{color:#04d} +.CodeRay .char .content{color:#04d} +.CodeRay .char .delimiter{color:#039} +.CodeRay .class{color:#458;font-weight:bold} +.CodeRay .complex{color:#a08} +.CodeRay .constant,.CodeRay .predefined-constant{color:#008080} +.CodeRay .color{color:#099} +.CodeRay .class-variable{color:#369} +.CodeRay .decorator{color:#b0b} +.CodeRay .definition{color:#099} +.CodeRay .delimiter{color:#000} +.CodeRay .doc{color:#970} +.CodeRay .doctype{color:#34b} +.CodeRay .doc-string{color:#d42} +.CodeRay .escape{color:#666} +.CodeRay .entity{color:#800} +.CodeRay .error{color:#808} +.CodeRay .exception{color:inherit} +.CodeRay .filename{color:#099} +.CodeRay .function{color:#900;font-weight:bold} +.CodeRay .global-variable{color:#008080} +.CodeRay .hex{color:#058} +.CodeRay .integer,.CodeRay .float{color:#099} +.CodeRay .include{color:#555} +.CodeRay .inline{color:#000} +.CodeRay .inline .inline{background:#ccc} +.CodeRay .inline .inline .inline{background:#bbb} +.CodeRay .inline .inline-delimiter{color:#d14} +.CodeRay .inline-delimiter{color:#d14} +.CodeRay .important{color:#555;font-weight:bold} +.CodeRay .interpreted{color:#b2b} +.CodeRay .instance-variable{color:#008080} +.CodeRay .label{color:#970} +.CodeRay .local-variable{color:#963} +.CodeRay .octal{color:#40e} +.CodeRay .predefined{color:#369} +.CodeRay .preprocessor{color:#579} +.CodeRay .pseudo-class{color:#555} +.CodeRay .directive{font-weight:bold} +.CodeRay .type{font-weight:bold} +.CodeRay .predefined-type{color:inherit} +.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold} +.CodeRay .key{color:#808} +.CodeRay .key .delimiter{color:#606} +.CodeRay .key .char{color:#80f} +.CodeRay .value{color:#088} +.CodeRay .regexp .delimiter{color:#808} +.CodeRay .regexp .content{color:#808} +.CodeRay .regexp .modifier{color:#808} +.CodeRay .regexp .char{color:#d14} +.CodeRay .regexp .function{color:#404;font-weight:bold} +.CodeRay .string{color:#d20} +.CodeRay .string .string .string{background:#ffd0d0} +.CodeRay .string .content{color:#d14} +.CodeRay .string .char{color:#d14} +.CodeRay .string .delimiter{color:#d14} +.CodeRay .shell{color:#d14} +.CodeRay .shell .delimiter{color:#d14} +.CodeRay .symbol{color:#990073} +.CodeRay .symbol .content{color:#a60} +.CodeRay .symbol .delimiter{color:#630} +.CodeRay .tag{color:#008080} +.CodeRay .tag-special{color:#d70} +.CodeRay .variable{color:#036} +.CodeRay .insert{background:#afa} +.CodeRay .delete{background:#faa} +.CodeRay .change{color:#aaf;background:#007} +.CodeRay .head{color:#f8f;background:#505} +.CodeRay .insert .insert{color:#080} +.CodeRay .delete .delete{color:#800} +.CodeRay .change .change{color:#66f} +.CodeRay .head .head{color:#f4f} +</style> +</head> +<body class="article toc2 toc-left"> +<div id="header"> +<h1>Apache Karaf Decanter 2.x - Documentation</h1> +<div class="details"> +<span id="author" class="author">Apache Software Foundation</span><br> +</div> +<div id="toc" class="toc2"> +<div id="toctitle">Apache Karaf Decanter 2.x - Documentation</div> +<ul class="sectlevel1"> +<li><a href="#user-guide">1. User Guide</a> +<ul class="sectlevel2"> +<li><a href="#introduction">1.1. Introduction</a></li> +<li><a href="#collectors">1.2. Collectors</a> +<ul class="sectlevel3"> +<li><a href="#log">1.2.1. Log</a></li> +<li><a href="#cxf-logging-feature-integration">1.2.2. CXF Logging feature integration</a></li> +<li><a href="#log-socket">1.2.3. Log Socket</a></li> +<li><a href="#file">1.2.4. File</a></li> +<li><a href="#eventadmin">1.2.5. EventAdmin</a></li> +<li><a href="#jmx">1.2.6. JMX</a></li> +<li><a href="#activemq-jmx">1.2.7. ActiveMQ (JMX)</a></li> +<li><a href="#camel-jmx">1.2.8. Camel (JMX)</a></li> +<li><a href="#camel-tracer-notifier">1.2.9. Camel Tracer & Notifier</a></li> +<li><a href="#system-oshi">1.2.10. System (oshi)</a></li> +<li><a href="#system-script">1.2.11. System (script)</a></li> +<li><a href="#network-socket">1.2.12. Network socket</a></li> +<li><a href="#jms">1.2.13. JMS</a></li> +<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> +</ul> +</li> +<li><a href="#appenders">1.3. Appenders</a> +<ul class="sectlevel3"> +<li><a href="#log-2">1.3.1. Log</a></li> +<li><a href="#elasticsearch-appender">1.3.2. Elasticsearch Appender</a></li> +<li><a href="#file-2">1.3.3. File</a></li> +<li><a href="#jdbc-2">1.3.4. JDBC</a></li> +<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> +</ul> +</li> +<li><a href="#alerting">1.4. Alerting</a> +<ul class="sectlevel3"> +<li><a href="#service">1.4.1. Service</a></li> +<li><a href="#alerters">1.4.2. Alerters</a></li> +</ul> +</li> +<li><a href="#processors">1.5. Processors</a> +<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> +</ul> +</li> +</ul> +</li> +<li><a href="#developer-guide">2. Developer Guide</a> +<ul class="sectlevel2"> +<li><a href="#architecture">2.1. Architecture</a></li> +<li><a href="#custom-collector">2.2. Custom Collector</a> +<ul class="sectlevel3"> +<li><a href="#event-driven-collector">2.2.1. Event Driven Collector</a></li> +<li><a href="#polled-collector">2.2.2. Polled Collector</a></li> +</ul> +</li> +<li><a href="#custom-appender">2.3. Custom Appender</a></li> +<li><a href="#custom-alerter">2.4. Custom Alerter</a></li> +<li><a href="#custom-processor">2.5. Custom Processor</a></li> +</ul> +</li> +</ul> +</div> +</div> +<div id="content"> +<div id="preamble"> +<div class="sectionbody"> +<div class="imageblock" style="text-align: center"> +<div class="content"> +<img src="images/asf_logo.png" alt="asf logo"> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="user-guide">1. User Guide</h2> +<div class="sectionbody"> +<div class="sect2"> +<h3 id="introduction">1.1. Introduction</h3> +<div class="paragraph"> +<p>Apache Karaf Decanter is a monitoring solution running in Apache Karaf.</p> +</div> +<div class="paragraph"> +<p>It’s composed of three parts:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>Collectors are responsible for harvesting monitoring data. Decanter provides collectors to harvest different kinds +of data. We have two kinds of collectors:</p> +<div class="ulist"> +<ul> +<li> +<p>Event Driven Collectors automatically react to events and send the event data to the Decanter appenders.</p> +</li> +<li> +<p>Polled Collectors are periodically called by the Decanter Scheduler. They harvest data and send it to the Decanter +appenders</p> +</li> +</ul> +</div> +</li> +<li> +<p>Appenders receive the data from the collectors and are responsible to store the data into a given backend. Decanter +provides appenders depending on the backend storage that you want to use.</p> +</li> +<li> +<p>Alerters are a special kind of appender. A check is performed on all harvested data. If a check fails, an alert event is created and sent to the alerters. Decanter provides alerters depending on the kind of notification that you want.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>Apache Karaf Decanter provides Karaf features for each collector, appender, alerter.</p> +</div> +<div class="paragraph"> +<p>The first thing to do is to add the Decanter features repository in Karaf:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:repo-add mvn:org.apache.karaf.decanter/apache-karaf-decanter/2.0.0/xml/features</pre> +</div> +</div> +<div class="paragraph"> +<p>Or</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:repo-add decanter 2.0.0</pre> +</div> +</div> +<div class="paragraph"> +<p>Now, you have to install the collectors, appenders, and eventually alerters feature to match your need.</p> +</div> +</div> +<div class="sect2"> +<h3 id="collectors">1.2. Collectors</h3> +<div class="paragraph"> +<p>Decanter collectors harvest the monitoring data, and send this data to the Decanter appenders.</p> +</div> +<div class="paragraph"> +<p>Two kinds of collector are available:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>Event Driven Collectors react to events and "broadcast" the data to the appenders.</p> +</li> +<li> +<p>Polled Collectors are periodically executed by the Decanter Scheduler. When executed, the collectors harvest the +data and send to the appenders.</p> +</li> +</ul> +</div> +<div class="sect3"> +<h4 id="log">1.2.1. Log</h4> +<div class="paragraph"> +<p>The Decanter Log Collector is an event driven collector. It automatically reacts when a log occurs, and +sends the log details (level, logger name, message, etc) to the appenders.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-log</code> feature installs the log collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-log</pre> +</div> +</div> +<div class="paragraph"> +<p>The log collector doesn’t need any configuration, the installation of the decanter-collector-log feature is enough.</p> +</div> +<div class="admonitionblock note"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-note" title="Note"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>The Decanter log collector is using <code>osgi:DecanterLogCollectorAppender</code> appender. +In order to work, your Apache Karaf Pax Logging configuration should contain this appender.</p> +</div> +<div class="paragraph"> +<p>The default Apache Karaf <code>etc/org.ops4j.pax.logging.cfg</code> configuration file is already fine:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>log4j.rootLogger = DEBUG, out, osgi:*</pre> +</div> +</div> +<div class="paragraph"> +<p>If you want, you can explicitly specify the <code>DecanterLogCollectorAppender</code> appender:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>log4j.rootLogger = DEBUG, out, osgi:DecanterLogCollectorAppender, osgi:VmLogAppender</pre> +</div> +</div> +</td> +</tr> +</table> +</div> +</div> +<div class="sect3"> +<h4 id="cxf-logging-feature-integration">1.2.2. CXF Logging feature integration</h4> +<div class="paragraph"> +<p>The <a href="http://cxf.apache.org/docs/message-logging.html">CXF message logging</a> nicely integrates with Decanter. Simply add the <a href="https://github.com/apache/cxf/blob/master/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java">org.apache.cxf.ext.logging.LoggingFeature</a> to your service.</p> +</div> +<div class="paragraph"> +<p>This will automatically log the messages from all clients and endpoints to slf4j. All meta data can be found in the MDC attributes. The message logging can be switched on/off per service using the org.ops4j.pax.logging.cfg.</p> +</div> +<div class="paragraph"> +<p>When using with Decanter make sure you enable the log collector to actually process the message logs.</p> +</div> +</div> +<div class="sect3"> +<h4 id="log-socket">1.2.3. Log Socket</h4> +<div class="paragraph"> +<p>The Decanter Log Socket Collector is an event driven collector. It creates a socket, waiting for incoming event. The expected +events are log4j LoggingEvent. The log4j LoggingEvent is transformed as a Map containing the log details (level, logger name, message, …​). +This Map is sent to the appenders.</p> +</div> +<div class="paragraph"> +<p>The collector allows you to remotely use Decanter. For instance, you can have an application running on a different platform (spring-boot, +application servers, …​). This application can use a log4j socket appender that send the logging events to the Decanter +log socket collector.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-log-socket</code> feature install the log socket collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-log-socket</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature installs the collector and a default <code>etc/org.apache.karaf.decanter.collector.log.socket.cfg</code> configuration file +containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre># +# Decanter Log/Log4j Socket collector configuration +# + +#port=4560 +#workers=10</pre> +</div> +</div> +<div class="ulist"> +<ul> +<li> +<p>the <code>port</code>Â property defines the port number where the collector is bound and listen for incoming logging event. Default is 4560.</p> +</li> +<li> +<p>the <code>workers</code> properties defines the number of threads (workers) which can deal with multiple clients in the same time.</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="file">1.2.4. File</h4> +<div class="paragraph"> +<p>The Decanter File Collector is an event driven collector. It automatically reacts when new lines are appended into +a file (especially a log file). It acts like the tail Unix command. Basically, it’s an alternative to the log collector. +The log collector reacts to local Karaf log messages, whereas the file collector can react to any file, including log +files from other systems to Karaf. It means that you can monitor and send collected data for any system (even if it is not Java +based).</p> +</div> +<div class="paragraph"> +<p>The file collector deals with file rotation, file not found.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-file</code> feature installs the file collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-file</pre> +</div> +</div> +<div class="paragraph"> +<p>Now, you have to create a configuration file for each file that you want to monitor. In the etc folder, you have to +create a file with the following format name <code>etc/org.apache.karaf.decanter.collector.file-ID.cfg</code> where ID is an ID +of your choice.</p> +</div> +<div class="paragraph"> +<p>This file contains:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>type=my +path=/path/to/file +any=value</pre> +</div> +</div> +<div class="ulist"> +<ul> +<li> +<p><code>type</code> is an ID (mandatory) that allows you to easily identify the monitored file</p> +</li> +<li> +<p><code>path</code> is the location of the file that you want to monitor</p> +</li> +<li> +<p>all other values (like <code>any</code>) will be part of the collected data. It means that you can add your own custom data, and +easily create queries bases on this data.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>You can also filter the lines read from the file using the <code>regex</code> property.</p> +</div> +<div class="paragraph"> +<p>For instance:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>regex=(.*foo.*)</pre> +</div> +</div> +<div class="paragraph"> +<p>Only the line matching the <code>regex</code> will be sent to the dispatcher.</p> +</div> +<div class="paragraph"> +<p>For instance, instead of the log collector, you can create the following <code>etc/org.apache.karaf.decanter.collector.file-karaf.cfg</code> +file collector configuration file:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>type=karaf-log-file +path=/path/to/karaf/data/log/karaf.log +regex=(.*my.*) +my=stuff</pre> +</div> +</div> +<div class="paragraph"> +<p>The file collector will tail on <code>karaf.log</code> file, and send any new line matching the <code>regex</code> in this log file as collected data.</p> +</div> +<div class="sect4"> +<h5 id="parser">Parser</h5> +<div class="paragraph"> +<p>By default, the collector use the <code>org.apache.karaf.decanter.impl.parser.IdentityParser</code> parser to parse the line into +a typed Object (Long, Integer or String) before send it to the EventDispatcher data map.</p> +</div> +<div class="sect5"> +<h6 id="identity-parser">Identity parser</h6> +<div class="paragraph"> +<p>The identity parser doesn’t actually parse the line, it just passes through. It’s the default parser used by the file collector.</p> +</div> +</div> +<div class="sect5"> +<h6 id="split-parser">Split parser</h6> +<div class="paragraph"> +<p>The split parser splits the line using a separator (<code>,</code> by default). Optionally, it can take <code>keys</code> used a property name in the event.</p> +</div> +<div class="paragraph"> +<p>For instance, you can have the following <code>etc/org.apache.karaf.decanter.parser.split.cfg</code> configuration file:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>separator=, +keys=first,second,third,fourth</pre> +</div> +</div> +<div class="paragraph"> +<p>If the parser gets a line (collected by the file collector) like <code>this,is,a,test</code>, the line will be parsed as follows (the file collector will send the following data to the dispatcher):</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>first->this +second->is +third->a +fourth->test</pre> +</div> +</div> +<div class="paragraph"> +<p>If the <code>keys</code> configuration is not set, then <code>key-0</code>, <code>key-1</code>, etc will be used.</p> +</div> +<div class="paragraph"> +<p>To use this parser in the file collector, you have to define it in the <code>parser.target</code> configuration (in <code>etc/org.apache.karaf.decanter.collector.file-XXXX.cfg</code>):</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>parser.target=(parserId=split)</pre> +</div> +</div> +</div> +<div class="sect5"> +<h6 id="regex-parser">Regex parser</h6> +<div class="paragraph"> +<p>The regex parser is similar to the split parser but instead of using a separator, it uses regex groups.</p> +</div> +<div class="paragraph"> +<p>The configuration contains the <code>regex</code> and the <code>keys</code> in the <code>etc/org.apache.karaf.decanter.parser.regex.cfg</code> configuration file:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>regex=(t.*t)</pre> +</div> +</div> +<div class="paragraph"> +<p>If the parser gets a line (collected by the file collector) like <code>a test here</code>, the line will be parsed as follows (the file collector will send the following data to the dispatcher):</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>key-0->test</pre> +</div> +</div> +<div class="paragraph"> +<p>It’s also possible to use <code>keys</code> to identify each regex group.</p> +</div> +<div class="paragraph"> +<p>To use this parser in the file collector, you have to define it in the <code>parser.target</code> configuration (in <code>etc/org.apache.karaf.decanter.collector.file-XXXX.cfg</code>):</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>parser.target=(parserId=regex)</pre> +</div> +</div> +</div> +<div class="sect5"> +<h6 id="custom-parser">Custom parser</h6> +<div class="paragraph"> +<p>You can write your own parser by implementing the <code>org.apache.karaf.decanter.api.parser.Parser</code> interface and declare +it into the file collector configuration file:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>parser.target=(parserId=myParser)</pre> +</div> +</div> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="eventadmin">1.2.5. EventAdmin</h4> +<div class="paragraph"> +<p>The Decanter EventAdmin Collector is an event-driven collector, listening for all internal events happening in +the Apache Karaf Container.</p> +</div> +<div class="admonitionblock note"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-note" title="Note"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>It’s the perfect way to audit all actions performed on resources (features, bundles, configurations, …​) by users +(via local shell console, SSH, or JMX).</p> +</div> +<div class="paragraph"> +<p>We recommend to use this collector to implement users and actions auditing.</p> +</div> +</td> +</tr> +</table> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-eventadmin</code> feature installs the eventadmin collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-eventadmin</pre> +</div> +</div> +<div class="paragraph"> +<p>By default, the eventadmin collector is listening for all OSGi framework and Karaf internal events.</p> +</div> +<div class="paragraph"> +<p>You can specify additional events to trap by providing a ‘etc/org.apache.karaf.decanter.collector.eventadmin-my.cfg’ configuration +file, containing the EventAdmin topics you want to listen:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>event.topics=my/*</pre> +</div> +</div> +<div class="admonitionblock note"> +<table> +<tr> +<td class="icon"> +<i class="fa icon-note" title="Note"></i> +</td> +<td class="content"> +<div class="paragraph"> +<p>By default, the events contain timestamp and subject. +You can disable this by modifying <code>etc/org.apache.felix.eventadmin.impl.EventAdmin</code> configuration file:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>org.apache.felix.eventadmin.AddTimestamp=true +org.apache.felix.eventadmin.AddSubject=true</pre> +</div> +</div> +</td> +</tr> +</table> +</div> +</div> +<div class="sect3"> +<h4 id="jmx">1.2.6. JMX</h4> +<div class="paragraph"> +<p>The Decanter JMX Collector is a polled collector, executed periodically by the Decanter Scheduler.</p> +</div> +<div class="paragraph"> +<p>The JMX collector connects to a JMX MBeanServer (local or remote), and retrieves all attributes of each available MBeans. +The JMX metrics (attribute values) are send to the appenders.</p> +</div> +<div class="paragraph"> +<p>In addition, the JMX collector also supports the execution of operations on dedicated ObjectName that you configure via <code>cfg</code> file.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-jmx</code> feature installs the JMX collector, and a default configuration file:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-jmx</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature brings a <code>etc/org.apache.karaf.decanter.collector.jmx-local.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre># +# Decanter Local JMX collector configuration +# + +# Name/type of the JMX collection +type=jmx-local + +# URL of the JMX MBeanServer. +# local keyword means the local platform MBeanServer or you can specify to full JMX URL +# like service:jmx:rmi:///jndi/rmi://hostname:port/karaf-instance +url=local + +# Username to connect to the JMX MBeanServer +#username=karaf + +# Password to connect to the JMX MBeanServer +#password=karaf + +# Object name filter to use. Instead of harvesting all MBeans, you can select only +# some MBeans matching the object name filter +#object.name=org.apache.camel:context=*,type=routes,name=* + +# Several object names can also be specified. +# What matters is that the property names begin with "object.name". +#object.name.system=java.lang:* +#object.name.karaf=org.apache.karaf:type=http,name=* +#object.name.3=org.apache.activemq:* + +# You can also execute operations on some MBeans, providing the object name, operation, arguments (separated by ,) +# and signatures (separated by ,) for the arguments (separated by |) +#operation.name.rootLogger=org.apache.karaf:type=log,name=root|getLevel|rootLogger|java.lang.String</pre> +</div> +</div> +<div class="paragraph"> +<p>This file harvests the data of the local MBeanServer:</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>the <code>type</code> property is a name (of your choice) allowing you to easily identify the harvested data</p> +</li> +<li> +<p>the <code>url</code> property is the MBeanServer to connect to. "local" is a reserved keyword to specify the local MBeanServer. +Instead of "local", you can use the JMX service URL. For instance, for Karaf version 3.0.0, 3.0.1, 3.0.2, and 3.0.3, +as the local MBeanServer is secured, you can specify <code>service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root</code>. You +can also polled any remote MBean server (Karaf based or not) providing the service URL.</p> +</li> +<li> +<p>the <code>username</code> property contains the username to connect to the MBean server. It’s only required if the MBean server +is secured.</p> +</li> +<li> +<p>the <code>password</code> property contains the password to connect to the MBean server. It’s only required if the MBean server +is secured.</p> +</li> +<li> +<p>the <code>object.name</code> prefix is optional. If this property is not specified, the collector will retrieve the attributes +of all MBeans. You can filter to consider only some MBeans. This property contains the ObjectName filter to retrieve +the attributes only of some MBeans. Several object names can be listed, provided the property prefix is <code>object.name.</code>.</p> +</li> +<li> +<p>any other values will be part of the collected data. It means that you can add your own property if you want to add +additional data, and create queries based on this data.</p> +</li> +<li> +<p>the <code>operation.name</code> prefix is also optional. You can use it to execute an operation. The value format is <code>objectName|operation|arguments|signatures</code>.</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>You can retrieve multiple MBean servers. For that, you just create a new configuration file using the file name format +<code>etc/org.apache.karaf.decanter.collector.jmx-[ANYNAME].cfg</code>.</p> +</div> +<div class="sect4"> +<h5 id="jmxmp">JMXMP</h5> +<div class="paragraph"> +<p>The Karaf Decanter JMX collector by default uses RMI protocol for JMX. But it also supports JMXMP protocol.</p> +</div> +<div class="paragraph"> +<p>The features to install are the same: <code>decanter-collector-jmx</code>.</p> +</div> +<div class="paragraph"> +<p>However, you have to enable the <code>jmxmp</code> protocol support in the Apache Karaf instance hosting Karaf Decanter.</p> +</div> +<div class="paragraph"> +<p>You can download the <code>jmxmp</code> protocol provider artifact on Maven Central: [<a href="http://repo.maven.apache.org/maven2/org/glassfish/external/opendmk_jmxremote_optional_jar/1.0-b01-ea/opendmk_jmxremote_optional_jar-1.0-b01-ea.jar" class="bare">http://repo.maven.apache.org/maven2/org/glassfish/external/opendmk_jmxremote_optional_jar/1.0-b01-ea/opendmk_jmxremote_optional_jar-1.0-b01-ea.jar</a>]</p> +</div> +<div class="paragraph"> +<p>The <code>opendmk_jmxremote_optional_jar-1.0-b01-ea.jar</code> file has to be copied in the <code>lib/boot</code> folder of your Apache Karaf instance.</p> +</div> +<div class="paragraph"> +<p>Then, you have to add the new JMX remote packages by editing <code>etc/config.properties</code>, appending the following to the <code>org.osgi.framework.system.packages.extra</code> property:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>org.osgi.framework.system.packages.extra = \ + ... + javax.remote, \ + com.sun.jmx, \ + com.sun.jmx.remote, \ + com.sun.jmx.remote.protocol, \ + com.sun.jmx.remote.generic, \ + com.sun.jmx.remote.opt, \ + com.sun.jmx.remote.opt.internal, \ + com.sun.jmx.remote.opt.security, \ + com.sun.jmx.remote.opt.util, \ + com.sun.jmx.remote.profile, \ + com.sun.jmx.remote.profile.sasl, \ + com.sun.jmx.remote.profile.tls, \ + com.sun.jmx.remote.socket, \ + javax.management, \ + javax.management.remote, \ + javax.management.remote.generic, \ + javax.management.remote.jmxmp, \ + javax.management.remote.message</pre> +</div> +</div> +<div class="paragraph"> +<p>Then, you can create a new Decanter JMX collector by creating a new file, like <code>etc/org.apache.karaf.decanter.collector.jmx-mycollector.cfg</code> containing something like:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>type=jmx-mycollector +url=service:jmx:jmxmp://host:port +jmx.remote.protocol.provider.pkgs=com.sun.jmx.remote.protocol</pre> +</div> +</div> +<div class="paragraph"> +<p>You can see: +* the <code>url</code> property contains an URL with <code>jmxmp</code> instead of <code>rmi</code>. +* in order to support <code>jmxmp</code> protocol, you have to set the protocol provider via the <code>jmx.remote.protocol.provider.pkgs</code> property (by default, Karaf Decanter JMX collector uses the <code>rmi</code> protocol provider)</p> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="activemq-jmx">1.2.7. ActiveMQ (JMX)</h4> +<div class="paragraph"> +<p>The ActiveMQ JMX collector is just a special configuration of the JMX collector.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-activemq</code> feature installs the default JMX collector, with the specific ActiveMQ JMX configuration:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-jmx-activemq</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature installs the same collector as the <code>decanter-collector-jmx</code>, but also adds the +<code>etc/org.apache.karaf.decanter.collector.jmx-activemq.cfg</code> configuration file.</p> +</div> +<div class="paragraph"> +<p>This file contains:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre># +# Decanter Local ActiveMQ JMX collector configuration +# + +# Name/type of the JMX collection +type=jmx-activemq + +# URL of the JMX MBeanServer. +# local keyword means the local platform MBeanServer or you can specify to full JMX URL +# like service:jmx:rmi:///jndi/rmi://hostname:port/karaf-instance +url=local + +# Username to connect to the JMX MBeanServer +#username=karaf + +# Password to connect to the JMX MBeanServer +#password=karaf + +# Object name filter to use. Instead of harvesting all MBeans, you can select only +# some MBeans matching the object name filter +object.name=org.apache.activemq:*</pre> +</div> +</div> +<div class="paragraph"> +<p>This configuration actually contains a filter to retrieve only the ActiveMQ JMX MBeans.</p> +</div> +</div> +<div class="sect3"> +<h4 id="camel-jmx">1.2.8. Camel (JMX)</h4> +<div class="paragraph"> +<p>The Camel JMX collector is just a special configuration of the JMX collector.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-jmx-camel</code> feature installs the default JMX collector, with the specific Camel JMX configuration:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-jmx-camel</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature installs the same collector as the <code>decanter-collector-jmx</code>, but also adds the +<code>etc/org.apache.karaf.decanter.collector.jmx-camel.cfg</code> configuration file.</p> +</div> +<div class="paragraph"> +<p>This file contains:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre># +# Decanter Local Camel JMX collector configuration +# + +# Name/type of the JMX collection +type=jmx-camel + +# URL of the JMX MBeanServer. +# local keyword means the local platform MBeanServer or you can specify to full JMX URL +# like service:jmx:rmi:///jndi/rmi://hostname:port/karaf-instance +url=local + +# Username to connect to the JMX MBeanServer +#username=karaf + +# Password to connect to the JMX MBeanServer +#password=karaf + +# Object name filter to use. Instead of harvesting all MBeans, you can select only +# some MBeans matching the object name filter +object.name=org.apache.camel:context=*,type=routes,name=*</pre> +</div> +</div> +<div class="paragraph"> +<p>This configuration actually contains a filter to retrieve only the Camel Routes JMX MBeans.</p> +</div> +</div> +<div class="sect3"> +<h4 id="camel-tracer-notifier">1.2.9. Camel Tracer & Notifier</h4> +<div class="paragraph"> +<p>Decanter provides a Camel Tracer Handler that you can set on a Camel Tracer. It also provides a Camel Event Notifier.</p> +</div> +<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> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-camel</code> feature provides the Camel Tracer Handler:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-camel</pre> +</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> +</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> +</div> +<div class="listingblock"> +<div class="content"> +<pre><?xml version="1.0" encoding="UTF-8"?> +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> + + <reference id="dispatcher" interface="org.osgi.service.event.EventAdmin"/> + + <bean id="traceHandler" class="org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler"> + <property name="dispatcher" ref="dispatcher"/> + </bean> + + <bean id="tracer" class="org.apache.camel.processor.interceptor.Tracer"> + <property name="traceHandler" ref="traceHandler"/> + <property name="enabled" value="true"/> + <property name="traceOutExchanges" value="true"/> + <property name="logLevel" value="OFF"/> + </bean> + + <camelContext trace="true" xmlns="http://camel.apache.org/schema/blueprint"> + <route id="test"> + <from uri="timer:fire?period=10000"/> + <setBody><constant>Hello World</constant></setBody> + <to uri="log:test"/> + </route> + </camelContext> + +</blueprint></pre> +</div> +</div> +<div class="paragraph"> +<p>You can extend the Decanter event with any property using a custom <code>DecanterCamelEventExtender</code>:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>public interface DecanterCamelEventExtender { + + void extend(Map<String, Object> decanterData, Exchange camelExchange); + +}</pre> +</div> +</div> +<div class="paragraph"> +<p>You can inject your extender using <code>setExtender(myExtender)</code> on the <code>DecanterTraceEventHandler</code>. Decanter will automatically +call your extender to populate extra properties.</p> +</div> +</div> +<div class="sect4"> +<h5 id="camel-event-notifier">Camel Event Notifier</h5> +<div class="paragraph"> +<p>Decanter also provides <code>DecanterEventNotifier</code> implementing a Camel event notifier: <a href="http://camel.apache.org/eventnotifier-to-log-details-about-all-sent-exchanges.html" class="bare">http://camel.apache.org/eventnotifier-to-log-details-about-all-sent-exchanges.html</a></p> +</div> +<div class="paragraph"> +<p>It’s very similar to the Decanter Camel Tracer. You can control the camel contexts and routes to which you want to trap events.</p> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="system-oshi">1.2.10. System (oshi)</h4> +<div class="paragraph"> +<p>The oshi collector is a system collector (polled) that periodically retrieve all details about the hardware and the operating system.</p> +</div> +<div class="paragraph"> +<p>This collector gets lot of details about the machine.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-oshi</code> feature installs the oshi system collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-oshi</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature installs a default <code>etc/org.apache.karaf.decanter.collector.oshi.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>################################################################################ +# +# 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. +# +################################################################################ + +# +# Decanter oshi (system) collector +# + +# computerSystem=true +# computerSystem.baseboard=true +# computerSystem.firmware=true +# memory=true +# processors=true +# processors.logical=true +# displays=true +# disks=true +# disks.partitions=true +# graphicsCards=true +# networkIFs=true +# powerSources=true +# soundCards=true +# sensors=true +# usbDevices=true +# operatingSystem=true +# operatingSystem.fileSystems=true +# operatingSystem.networkParams=true +# operatingSystem.processes=true +# operatingSystem.services=true</pre> +</div> +</div> +<div class="paragraph"> +<p>By default, the oshi collector gets all details about the machine. You can filter what you want to harvest in this configuration file.</p> +</div> +</div> +<div class="sect3"> +<h4 id="system-script">1.2.11. System (script)</h4> +<div class="paragraph"> +<p>The system collector is a polled collector (periodically executed by the Decanter Scheduler).</p> +</div> +<div class="paragraph"> +<p>This collector executes operating system commands (or scripts) and send the execution output to the appenders.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-system</code> feature installs the system collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-system</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature installs a default <code>etc/org.apache.karaf.decanter.collector.system.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre># +# Decanter OperationSystem Collector configuration +# + +# This collector executes system commands, retrieve the exec output/err +#Â sent to the appenders +# +# You can define the number of thread to use for parallelization command calls: +# thread.number=1 +# +# The format is command.key=command_to_execute +# where command is a reserved keyword used to identify a command property +# for instance: +# +# command.df=df -h +# command.free=free +# +# You can also create a script containing command like: +# +# df -k / | awk -F " |%" '/dev/{print $8}' +# +# This script will get the available space on the / filesystem for instance. +# and call the script: +# +# command.df=/bin/script +# +# Another example of script to get the temperature: +# +# sensors|grep temp1|awk '{print $2}'|cut -b2,3,4,5 +#</pre> +</div> +</div> +<div class="paragraph"> +<p>You can add the commands that you want to execute using the format:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>command.name=system_command</pre> +</div> +</div> +<div class="paragraph"> +<p>The collector will execute each command described in this file, and send the execution output to the appenders.</p> +</div> +<div class="paragraph"> +<p>For instance, if you want to periodically send the free space available on the / filesystem, you can add:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>command.df=df -k / | awk -F " |%" '/dev/{print $8}'</pre> +</div> +</div> +</div> +<div class="sect3"> +<h4 id="network-socket">1.2.12. Network socket</h4> +<div class="paragraph"> +<p>The Decanter network socket collector listens for incoming messages coming from a remote network socket collector.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-socket</code> feature installs the network socket collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-socket</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature installs a default <code>etc/org.apache.karaf.decanter.collector.socket.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre># Decanter Socket Collector + +# Port number on which to listen +#port=34343 + +# Number of worker threads to deal with +#workers=10 + +# Protocol tcp(default) or udp +#protocol=tcp + +# Unmarshaller to use +# Unmarshaller is identified by data format. The default is json, but you can use another unmarshaller +unmarshaller.target=(dataFormat=json)</pre> +</div> +</div> +<div class="ulist"> +<ul> +<li> +<p>the <code>port</code> property contains the port number 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> +<p>the <code>protocol</code> property contains the protocol used by the collector for transferring data with the client</p> +</li> +<li> +<p>the <code>unmarshaller.target</code> property contains the unmarshaller used by the collector to transform the data +sent by the client.</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="jms">1.2.13. JMS</h4> +<div class="paragraph"> +<p>The Decanter JMS collector consumes the data from a JMS queue or topic. It’s a way to aggregate collected data coming +from (several) remote machines.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-jms</code> feature installs the JMS collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-jms</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature also installs a default <code>etc/org.apache.karaf.decanter.collector.jms.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>###################################### +# Decanter JMS Collector Configuration +###################################### + +# Name of the JMS connection factory +connection.factory.name=jms/decanter + +# Name of the destination +destination.name=decanter + +# Type of the destination (queue or topic) +destination.type=queue + +# Connection username +# username= + +# Connection password +# password=</pre> +</div> +</div> +<div class="ulist"> +<ul> +<li> +<p>the <code>connection.factory.name</code> is the name of the ConnectionFactory OSGi service to use</p> +</li> +<li> +<p>the <code>destination.name</code> is the name of the queue or topic where to consume messages from the JMS broker</p> +</li> +<li> +<p>the <code>destination.type</code> is the type of the destination (queue or topic)</p> +</li> +<li> +<p>the <code>username</code> and <code>password</code> properties are the credentials to use with a secured connection factory</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="mqtt">1.2.14. MQTT</h4> +<div class="paragraph"> +<p>The Decanter MQTT collector receives collected messages from a MQTT broker. It’s a way to aggregate collected data coming +from (several) remote machines.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-mqtt</code> feature installs the MQTT collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-mqtt</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature also installs a default <code>etc/org.apache.karaf.decanter.collector.mqtt.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>####################################### +# Decanter MQTT Collector Configuration +####################################### + +# URI of the MQTT broker +server.uri=tcp://localhost:61616 + +# MQTT Client ID +client.id=decanter + +# MQTT topic name +topic=decanter</pre> +</div> +</div> +<div class="ulist"> +<ul> +<li> +<p>the <code>server.uri</code> is the location of the MQTT broker</p> +</li> +<li> +<p>the <code>client.id</code> is the Decanter MQTT client ID</p> +</li> +<li> +<p>the <code>topic</code> is the MQTT topic pattern where to receive the messages</p> +</li> +</ul> +</div> +</div> +<div class="sect3"> +<h4 id="kafka">1.2.15. Kafka</h4> +<div class="paragraph"> +<p>The Decanter Kafka collector receives collected messages from a Kafka broker. It’s a way to aggregate collected data coming +from (several) remote machines.</p> +</div> +<div class="paragraph"> +<p>The <code>decanter-collector-kafka</code> feature installs the Kafka collector:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>karaf@root()> feature:install decanter-collector-kafka</pre> +</div> +</div> +<div class="paragraph"> +<p>This feature also installs a default <code>etc/org.apache.karaf.decanter.collector.kafka.cfg</code> configuration file containing:</p> +</div> +<div class="listingblock"> +<div class="content"> +<pre>############################### +# Decanter Kafka Configuration +############################### + +# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster +#bootstrap.servers=localhost:9092 + +# An id string to identify the group where the consumer belongs to +#group.id=decanter + +# Enable auto commit of consumed messages +#enable.auto.commit=true + +# Auto commit interval (in ms) triggering the commit +#auto.commit.interval.ms=1000 + +# Timeout on the consumer session +#session.timeout.ms=30000 + +#Â Serializer class for key that implements the Serializer interface +#key.serializer=org.apache.kafka.common.serialization.StringSerializer +
[... 2623 lines stripped ...]
