diff --git a/.gitignore b/.gitignore index dae37686b1..4d0da02eec 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ nb-configuration.xml .flattened-pom.xml # Maven extensions .mvn/extensions.xml + +# Node dependencies +/node_modules/ diff --git a/antora-playbook.yaml b/antora-playbook.yaml new file mode 100644 index 0000000000..cc5fa88e1e --- /dev/null +++ b/antora-playbook.yaml @@ -0,0 +1,43 @@ +# +# 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. +# + +site: + title: Apache Flume + url: "https://flume.apache.org" + start_page: "flume::index.adoc" + +content: + sources: + - url: . + branches: HEAD + start_paths: + - src/site/antora + edit_url: "https://github.com/apache/logging-flume-site/edit/{refname}/{path}" + +asciidoc: + attributes: + tabs-sync-option: true + extensions: + - "@asciidoctor/tabs" + +ui: + bundle: + url: "https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/HEAD/raw/build/ui-bundle.zip?job=bundle-stable" + snapshot: true + +output: + dir: ./target/site diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..c3940d3add --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1916 @@ +{ + "name": "logging-flume-site", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "logging-flume-site", + "version": "1.0.0", + "dependencies": { + "@antora/cli": "^3.1.0", + "@antora/site-generator-default": "^3.1.0", + "@asciidoctor/tabs": "^1.0.0-beta.6" + } + }, + "node_modules/@antora/asciidoc-loader": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.15.tgz", + "integrity": "sha512-MVspbcMPmBgxZms0EjmyC9nlCAWBJfHYSwQCXRZn6T7OujRrLvJFPgz+EROz9XOqh4v76BeqgEuLsUJIZjH3cw==", + "license": "MPL-2.0", + "dependencies": { + "@antora/logger": "3.1.15", + "@antora/user-require-helper": "~3.0", + "@asciidoctor/core": "~2.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/cli": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.15.tgz", + "integrity": "sha512-76vLhkyzyFd49WJHsC04oPAZlK4qWbJaeZdS/pLUUVBqgaxeSeNqpTZ0pXo7f+5laGRO19fXyk1eDWGus9h8jA==", + "license": "MPL-2.0", + "dependencies": { + "@antora/logger": "3.1.15", + "@antora/playbook-builder": "3.1.15", + "@antora/user-require-helper": "~3.0", + "commander": "~11.1" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/content-aggregator": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.15.tgz", + "integrity": "sha512-w84rJRKx+C4dsSbOHmjg78oM2T6xP9JRDsxpXjTmlh9T4zlNELCB6AD5s6Gztt3S6wlTiCNFLZw0v/HEVtuhzQ==", + "license": "MPL-2.0", + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "@antora/logger": "3.1.15", + "@antora/user-require-helper": "~3.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "isomorphic-git": "~1.25", + "js-yaml": "~4.1", + "multi-progress": "~4.0", + "picomatch": "~4.0", + "progress": "~2.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/content-classifier": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.15.tgz", + "integrity": "sha512-m7INbqJcXBZU04HdBMqfL/NvezC3aaJGHHa0KfzeEKICg5FT22cVsEp6mYTgJVT4HqRy7JPCn9UeZvoa9x+MzQ==", + "license": "MPL-2.0", + "dependencies": { + "@antora/asciidoc-loader": "3.1.15", + "@antora/logger": "3.1.15", + "mime-types": "~2.1", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/document-converter": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.15.tgz", + "integrity": "sha512-7YZsc/iIJVTxvHKy0/eqPTuRIJupBd7Pq49gWvCxiDBR9Zj4esqMZIU3HaIbkBgqJLlQv5TLBeTjiQ1Qpe1hNw==", + "license": "MPL-2.0", + "dependencies": { + "@antora/asciidoc-loader": "3.1.15" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/expand-path-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-3.0.0.tgz", + "integrity": "sha512-7PdEIhk97v85/CSm3HynCsX14TR6oIVz1s233nNLsiWubE8tTnpPt4sNRJR+hpmIZ6Bx9c6QDp3XIoiyu/WYYA==", + "license": "MPL-2.0", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/file-publisher": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.15.tgz", + "integrity": "sha512-UfLYeyD6Na9YXespr3Xjy6OPIAGG6GTbdW3SNn8KxHl3hGeF/AtM3NaR+AJgyOmTb2r9lHzfODXeZevqX+vMww==", + "license": "MPL-2.0", + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "@antora/user-require-helper": "~3.0", + "vinyl": "~3.0", + "yazl": "~3.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/logger": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.15.tgz", + "integrity": "sha512-txA2Nv0QQ+hIt6arc3Rrh1BiUJNlucsyNF7ZA7LgtN+rzxyjcqQPpbQ2F3tU2lOV/LOQCEvMbmz9Dj0tY8oBuA==", + "license": "MPL-2.0", + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "pino": "~9.2", + "pino-pretty": "~11.2", + "sonic-boom": "~4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/navigation-builder": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.15.tgz", + "integrity": "sha512-XRs4pfNd88GCG9lDAJ1J+2vwvre7OzNRSgRmZhEhtgv0A13NEZq37X4YuaH46F2kj2BqiZT8UOuxqAqarLaxmg==", + "license": "MPL-2.0", + "dependencies": { + "@antora/asciidoc-loader": "3.1.15" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/page-composer": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.15.tgz", + "integrity": "sha512-koKlhWilA0E0QdCCOeLLzCFLNViBVjNe3aIlmJnMCwAK0p85wyhVfyolNqbNejAvdCZ87YhUQJ52Q4ikCgkQQg==", + "license": "MPL-2.0", + "dependencies": { + "@antora/logger": "3.1.15", + "handlebars": "~4.7", + "require-from-string": "~2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/playbook-builder": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.15.tgz", + "integrity": "sha512-L2bE9FS0Th/d37DeDjz/dg9YXrkHM1xI0WQB3eiW3K/6d0Mc7eJhbmDMT0K8S+hgdaO0AT4kqDWzvx2866ZobA==", + "license": "MPL-2.0", + "dependencies": { + "@iarna/toml": "~2.2", + "convict": "~6.2", + "js-yaml": "~4.1", + "json5": "~2.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/redirect-producer": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.15.tgz", + "integrity": "sha512-mV0KnRiTr9oi0hPm7okT/Bw8kkz+PWYxp9AVSGqzhkoQgr3crxhgyS0NFCoViHwjaj4NfQrf++yxbhr6Igd7Dw==", + "license": "MPL-2.0", + "dependencies": { + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-generator": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.15.tgz", + "integrity": "sha512-Z9YiRTqw3ssnLQxSHI3VZHEPLytQXt8cWC5C/o9vS+Fc560TSNs1UO4quPFIkg+bFUpxXtcAxqbp650aA4/N1g==", + "license": "MPL-2.0", + "dependencies": { + "@antora/asciidoc-loader": "3.1.15", + "@antora/content-aggregator": "3.1.15", + "@antora/content-classifier": "3.1.15", + "@antora/document-converter": "3.1.15", + "@antora/file-publisher": "3.1.15", + "@antora/logger": "3.1.15", + "@antora/navigation-builder": "3.1.15", + "@antora/page-composer": "3.1.15", + "@antora/playbook-builder": "3.1.15", + "@antora/redirect-producer": "3.1.15", + "@antora/site-mapper": "3.1.15", + "@antora/site-publisher": "3.1.15", + "@antora/ui-loader": "3.1.15", + "@antora/user-require-helper": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-generator-default": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.15.tgz", + "integrity": "sha512-rXCVv513b617kKu8dVAxeDUKhtkzRujTICzjuDEy/sfAnHuFLcuR169lPS6qYdN/uOh4P6cXyBBzVw4F6JvyyA==", + "license": "MPL-2.0", + "dependencies": { + "@antora/site-generator": "3.1.15" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-mapper": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.15.tgz", + "integrity": "sha512-dV5zGeL1uMQ83sfkBWKg8vjaJQXz1Zh3ZSNQZYa64HnT4M7oSuQUzwDZdS0j6ZtTiYcNGulRi1ucz3uIoc9tqw==", + "license": "MPL-2.0", + "dependencies": { + "@antora/content-classifier": "3.1.15", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-publisher": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.15.tgz", + "integrity": "sha512-pBuNxgA+H+WB5F4gA/gim5wKx/884QwlqOl0CpOY+6Fqn7h2ooHA7Tv6O47Tra1nZzNbIe3CQRoA5pnrX6zyRw==", + "license": "MPL-2.0", + "dependencies": { + "@antora/file-publisher": "3.1.15" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/ui-loader": { + "version": "3.1.15", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.15.tgz", + "integrity": "sha512-zYjF5ID7t6mUEJuMyeNW/AYu1U0026wZj58H0siGuaT5YhVoxZrfvZYWV5iCMntpKduMqkwZW/l+D4MIqjhFYQ==", + "license": "MPL-2.0", + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "js-yaml": "~4.1", + "picomatch": "~4.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0", + "yauzl": "~3.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/user-require-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-3.0.0.tgz", + "integrity": "sha512-KIXb8WYhnrnwH7Jj21l1w+et9k5GvcgcqvLOwxqWLEd0uVZOiMFdqFjqbVm3M+zcrs1JXWMeh2LLvxBbQs3q/Q==", + "license": "MPL-2.0", + "dependencies": { + "@antora/expand-path-helper": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@asciidoctor/core": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.9.tgz", + "integrity": "sha512-tIPRHo1T2SFmAm+j77cDsj0RuaszP7xJxsaVTTAF5CwKyTbazw9TnIVlpIWM5yWfIWAWcAZy92RcnPgMJwny1w==", + "license": "MIT", + "dependencies": { + "asciidoctor-opal-runtime": "0.3.4", + "unxhr": "~1.2" + }, + "engines": { + "node": ">=8.11", + "npm": ">=5.0.0", + "yarn": ">=1.1.0" + } + }, + "node_modules/@asciidoctor/tabs": { + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@asciidoctor/tabs/-/tabs-1.0.0-beta.6.tgz", + "integrity": "sha512-gGZnW7UfRXnbiyKNd9PpGKtSuD8+DsqaaTSbQ1dHVkZ76NaolLhdQg8RW6/xqN3pX1vWZEcF4e81+Oe9rNRWxg==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "license": "ISC" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asciidoctor-opal-runtime": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.4.tgz", + "integrity": "sha512-zqd6zn1LV+PZ69AP/kEbB00zuPHMIAJY3IX8+aZV+X1qOwatYvKGjsMmdMc5ApfhtkjZ4mYkqiTPJWnEnBiMJg==", + "license": "MIT", + "dependencies": { + "fast-glob": "~3.3", + "unxhr": "~1.2" + }, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bare-events": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", + "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cache-directory": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", + "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", + "license": "LGPL-3.0+", + "dependencies": { + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "license": "Apache-2.0" + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/convict": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.5.tgz", + "integrity": "sha512-JtXpxqDqJ8P0UwEHwhxLzCIXQy97vlYBZR222Sbzb1q1Erex9ASrztJ29SyhWFQjod1AeFBaPzEEC8YvtZMIYg==", + "license": "Apache-2.0", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isomorphic-git": { + "version": "1.25.10", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", + "integrity": "sha512-IxGiaKBwAdcgBXwIcxJU6rHLk+NrzYaaPKXXQffcA0GW3IUrQXdUPDXDo+hkGVcYruuz/7JlGBiuaeTCgIgivQ==", + "license": "MIT", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^3.4.0", + "sha.js": "^2.4.9", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/multi-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz", + "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==", + "license": "MIT", + "peerDependencies": { + "progress": "^2.0.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pino": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.2.0.tgz", + "integrity": "sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "license": "ISC" + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/should-proxy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/should-proxy/-/should-proxy-1.0.4.tgz", + "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==", + "license": "MIT" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/streamx": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", + "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thread-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz", + "integrity": "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unxhr": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.2.0.tgz", + "integrity": "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw==", + "license": "MIT", + "engines": { + "node": ">=8.11" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vinyl": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.2.tgz", + "integrity": "sha512-Md9ankxxN23wncAN8s7+Tn3Co52zLUPMtnrLAbVCnfG5d2tKBFfmygYSgXlqFgXObtzIgqkx7aNgDBpso9+4qA==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yazl": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-3.3.1.tgz", + "integrity": "sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "^1.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..ef3300894d --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "logging-flume-site", + "version": "1.0.0", + "description": "Apache Flume website, built with Antora", + "private": true, + "scripts": { + "build": "antora --fetch antora-playbook.yaml" + }, + "dependencies": { + "@antora/cli": "^3.1.0", + "@antora/site-generator-default": "^3.1.0", + "@asciidoctor/tabs": "^1.0.0-beta.6" + } +} diff --git a/src/site/antora/antora.yml b/src/site/antora/antora.yml new file mode 100644 index 0000000000..6ba752a50d --- /dev/null +++ b/src/site/antora/antora.yml @@ -0,0 +1,23 @@ +# +# 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. +# + +name: flume +title: Apache Flume +version: ~ +start_page: index.adoc +nav: + - modules/ROOT/nav.adoc diff --git a/src/site/antora/modules/ROOT/images/DevGuide_image00.png b/src/site/antora/modules/ROOT/images/DevGuide_image00.png new file mode 100755 index 0000000000..dd7eff0d5c Binary files /dev/null and b/src/site/antora/modules/ROOT/images/DevGuide_image00.png differ diff --git a/src/site/antora/modules/ROOT/images/DevGuide_image01.png b/src/site/antora/modules/ROOT/images/DevGuide_image01.png new file mode 100755 index 0000000000..ed77828d62 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/DevGuide_image01.png differ diff --git a/src/site/antora/modules/ROOT/images/UserGuide_image00.png b/src/site/antora/modules/ROOT/images/UserGuide_image00.png new file mode 100755 index 0000000000..e587daf9e3 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/UserGuide_image00.png differ diff --git a/src/site/antora/modules/ROOT/images/UserGuide_image01.png b/src/site/antora/modules/ROOT/images/UserGuide_image01.png new file mode 100755 index 0000000000..ea97b2d195 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/UserGuide_image01.png differ diff --git a/src/site/antora/modules/ROOT/images/UserGuide_image02.png b/src/site/antora/modules/ROOT/images/UserGuide_image02.png new file mode 100755 index 0000000000..85bdd95239 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/UserGuide_image02.png differ diff --git a/src/site/antora/modules/ROOT/images/UserGuide_image03.png b/src/site/antora/modules/ROOT/images/UserGuide_image03.png new file mode 100755 index 0000000000..b028b8b107 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/UserGuide_image03.png differ diff --git a/src/site/antora/modules/ROOT/images/feather-small.png b/src/site/antora/modules/ROOT/images/feather-small.png new file mode 100644 index 0000000000..b944a35e69 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/feather-small.png differ diff --git a/src/site/antora/modules/ROOT/images/flume-logo.png b/src/site/antora/modules/ROOT/images/flume-logo.png new file mode 100644 index 0000000000..f9ac5e2ec1 Binary files /dev/null and b/src/site/antora/modules/ROOT/images/flume-logo.png differ diff --git a/src/site/antora/modules/ROOT/nav.adoc b/src/site/antora/modules/ROOT/nav.adoc new file mode 100644 index 0000000000..484a6166d4 --- /dev/null +++ b/src/site/antora/modules/ROOT/nav.adoc @@ -0,0 +1,52 @@ +//// + 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. +//// + +* xref:index.adoc[Home] +* xref:getinvolved.adoc[Get Involved] +* xref:download.adoc[Download] +* xref:security.adoc[Security] +* xref:documentation.adoc[Documentation] +** xref:FlumeUserGuide.adoc[Flume User Guide] +** xref:FlumeDeveloperGuide.adoc[Flume Developer Guide] +* xref:releases/index.adoc[Releases] +** xref:releases/1.11.0.adoc[1.11.0] +** xref:releases/1.10.1.adoc[1.10.1] +** xref:releases/1.10.0.adoc[1.10.0] +** xref:releases/1.9.0.adoc[1.9.0] +** xref:releases/1.8.0.adoc[1.8.0] +** xref:releases/1.7.0.adoc[1.7.0] +** xref:releases/1.6.0.adoc[1.6.0] +** xref:releases/1.5.2.adoc[1.5.2] +** xref:releases/1.5.0.1.adoc[1.5.0.1] +** xref:releases/1.5.0.adoc[1.5.0] +** xref:releases/1.4.0.adoc[1.4.0] +** xref:releases/1.3.1.adoc[1.3.1] +** xref:releases/1.3.0.adoc[1.3.0] +** xref:releases/1.2.0.adoc[1.2.0] +** xref:releases/1.1.0.adoc[1.1.0] +** xref:releases/1.0.0.adoc[1.0.0] +* xref:flume-spring-boot/index.adoc[Flume Spring Boot] +** xref:flume-spring-boot/download.adoc[Download] +** xref:flume-spring-boot/releases/index.adoc[Releases] +*** xref:flume-spring-boot/releases/2.0.0.adoc[2.0.0] +** xref:flume-spring-boot/source.adoc[Source] +* xref:team.adoc[Team] +* xref:mailinglists.adoc[Mailing Lists] +* xref:source.adoc[Source Repository] +* xref:subprojects.adoc[Subprojects] +* xref:testing.adoc[Testing] +* xref:license.adoc[License] diff --git a/src/site/antora/modules/ROOT/pages/FlumeDeveloperGuide.adoc b/src/site/antora/modules/ROOT/pages/FlumeDeveloperGuide.adoc new file mode 100644 index 0000000000..522c5d0e58 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/FlumeDeveloperGuide.adoc @@ -0,0 +1,951 @@ +//// + 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. +//// + += Flume 1.11.0 Developer Guide + +== Overview + +Apache Flume is a distributed, reliable, and available system for +efficiently collecting, aggregating and moving large amounts of log +data from many different sources to a centralized data store. + +Apache Flume is a top-level project at the Apache Software Foundation. +There are currently two release code lines available, versions 0.9.x and 1.x. +This documentation applies to the 1.x codeline. +For the 0.9.x codeline, please see the https://archive.cloudera.com/cdh/3/flume/DeveloperGuide/[Flume 0.9.x Developer Guide]. + +== Architecture + +=== Data flow model + +An `Event` is a unit of data that flows through a Flume agent. The `Event` +flows from `Source` to `Channel` to `Sink`, and is represented by an +implementation of the `Event` interface. An `Event` carries a payload (byte +array) that is accompanied by an optional set of headers (string attributes). +A Flume agent is a process (JVM) that hosts the components that allow +`Event`s to flow from an external source to a external destination. + +image::DevGuide_image00.png[Agent component diagram] + +A `Source` consumes `Event`s having a specific format, and those +`Event`s are delivered to the `Source` by an external source like a web +server. For example, an `AvroSource` can be used to receive Avro `Event`s +from clients or from other Flume agents in the flow. When a `Source` receives +an `Event`, it stores it into one or more `Channel`s. The `Channel` is +a passive store that holds the `Event` until that `Event` is consumed by a +`Sink`. One type of `Channel` available in Flume is the `FileChannel` +which uses the local filesystem as its backing store. A `Sink` is responsible +for removing an `Event` from the `Channel` and putting it into an external +repository like HDFS (in the case of an `HDFSEventSink`) or forwarding it to +the `Source` at the next hop of the flow. The `Source` and `Sink` within +the given agent run asynchronously with the `Event`s staged in the +`Channel`. + +=== Reliability + +An `Event` is staged in a Flume agent's `Channel`. Then it's the +`Sink`'s responsibility to deliver the `Event` to the next agent or +terminal repository (like HDFS) in the flow. The `Sink` removes an `Event` +from the `Channel` only after the `Event` is stored into the `Channel` of +the next agent or stored in the terminal repository. This is how the single-hop +message delivery semantics in Flume provide end-to-end reliability of the flow. +Flume uses a transactional approach to guarantee the reliable delivery of the +`Event`s. The `Source`s and `Sink`s encapsulate the +storage/retrieval of the `Event`s in a `Transaction` provided by the +`Channel`. This ensures that the set of `Event`s are reliably passed from +point to point in the flow. In the case of a multi-hop flow, the `Sink` from +the previous hop and the `Source` of the next hop both have their +`Transaction`s open to ensure that the `Event` data is safely stored in +the `Channel` of the next hop. + +== Building Flume + +=== Getting the source + +Check-out the code using Git. Click here for +https://git-wip-us.apache.org/repos/asf/flume.git[the git repository root] +or at https://github.com/apache/flume.git[GitHub]. + +The Flume 1.x development happens under the branch "trunk" so this command line +can be used: + +____ +git clone https://git-wip-us.apache.org/repos/asf/flume.git +____ + +or + +____ +git clone https://github.com/apache/flume.git +____ + +=== Compile/test Flume + +The Flume build is mavenized. You can compile Flume using the standard Maven +commands: + +. Compile only: `mvn clean compile` +. Compile and run unit tests: `mvn clean test` +. Run individual test(s): `mvn clean test -Dtest=++<++Test1++>++,++<++Test2++>++,... -DfailIfNoTests=false` +. Create tarball package: `mvn clean install` +. Create tarball package (skip unit tests): `mvn clean install -DskipTests` + +=== Updating Protocol Buffer Version + +File channel has a dependency on Protocol Buffer. When updating the version of Protocol Buffer +used by Flume, it is necessary to regenerate the data access classes using the protoc compiler +that is part of Protocol Buffer as follows. + +. Update version of Protocol Buffer in pom.xml +. Add Apache license header to any of the generated files that are missing it +. Rebuild and test Flume: `cd ../..; mvn clean install` + +== Developing custom components + +=== Client + +The client operates at the point of origin of events and delivers them to a +Flume agent. Clients typically operate in the process space of the application +they are consuming data from. Flume currently supports Avro, log4j, syslog, +and Http POST (with a JSON body) as ways to transfer data from a external +source. Additionally, there’s an `ExecSource` that can consume the output of a +local process as input to Flume. + +It’s quite possible to have a use case where these existing options are not +sufficient. In this case you can build a custom mechanism to send data to +Flume. There are two ways of achieving this. The first option is to create a +custom client that communicates with one of Flume’s existing `Source`s like +`AvroSource` or `SyslogTcpSource`. Here the client should convert its data +into messages understood by these Flume `Source`s. The other option is to +write a custom Flume `Source` that directly talks with your existing client +application using some IPC or RPC protocol, and then converts the client data +into Flume `Event`s to be sent downstream. Note that all events stored +within the `Channel` of a Flume agent must exist as Flume `Event`s. + +==== Client SDK + +Though Flume contains a number of built-in mechanisms (i.e. `Source`s) to +ingest data, often one wants the ability to communicate with Flume directly from +a custom application. The Flume Client SDK is a library that enables +applications to connect to Flume and send data into Flume’s data flow over RPC. + +==== RPC client interface + +An implementation of Flume's RpcClient interface encapsulates the RPC mechanism +supported by Flume. The user's application can simply call the Flume Client +SDK's `append(Event)` or `appendBatch(List++<++Event++>++)` to send data and not +worry about the underlying message exchange details. The user can provide the +required `Event` arg by either directly implementing the `Event` interface, +by using a convenience implementation such as the SimpleEvent class, or by using +`EventBuilder`'s overloaded `withBody()` static helper methods. + +==== RPC clients - Avro and Thrift + +As of Flume 1.4.0, Avro is the default RPC protocol. The +`NettyAvroRpcClient` and `ThriftRpcClient` implement the `RpcClient` +interface. The client needs to create this object with the host and port of +the target Flume agent, and can then use the `RpcClient` to send data into +the agent. The following example shows how to use the Flume Client SDK API +within a user's data-generating application: + +[source,java] +---- +import org.apache.flume.Event; +import org.apache.flume.EventDeliveryException; +import org.apache.flume.api.RpcClient; +import org.apache.flume.api.RpcClientFactory; +import org.apache.flume.event.EventBuilder; +import java.nio.charset.Charset; + +public class MyApp { + public static void main(String[] args) { + MyRpcClientFacade client = new MyRpcClientFacade(); + // Initialize client with the remote Flume agent's host and port + client.init("host.example.org", 41414); + + // Send 10 events to the remote Flume agent. That agent should be + // configured to listen with an AvroSource. + String sampleData = "Hello Flume!"; + for (int i = 0; i < 10; i++) { + client.sendDataToFlume(sampleData); + } + + client.cleanUp(); + } +} + +class MyRpcClientFacade { + private RpcClient client; + private String hostname; + private int port; + + public void init(String hostname, int port) { + // Setup the RPC connection + this.hostname = hostname; + this.port = port; + this.client = RpcClientFactory.getDefaultInstance(hostname, port); + // Use the following method to create a thrift client (instead of the above line): + // this.client = RpcClientFactory.getThriftInstance(hostname, port); + } + + public void sendDataToFlume(String data) { + // Create a Flume Event object that encapsulates the sample data + Event event = EventBuilder.withBody(data, Charset.forName("UTF-8")); + + // Send the event + try { + client.append(event); + } catch (EventDeliveryException e) { + // clean up and recreate the client + client.close(); + client = null; + client = RpcClientFactory.getDefaultInstance(hostname, port); + // Use the following method to create a thrift client (instead of the above line): + // this.client = RpcClientFactory.getThriftInstance(hostname, port); + } + } + + public void cleanUp() { + // Close the RPC connection + client.close(); + } + +} +---- + +The remote Flume agent needs to have an `AvroSource` (or a +`ThriftSource` if you are using a Thrift client) listening on some port. +Below is an example Flume agent configuration that's waiting for a connection +from MyApp: + +[source,properties] +---- +a1.channels = c1 +a1.sources = r1 +a1.sinks = k1 + +a1.channels.c1.type = memory + +a1.sources.r1.channels = c1 +a1.sources.r1.type = avro +# For using a thrift source set the following instead of the above line. +# a1.source.r1.type = thrift +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = 41414 + +a1.sinks.k1.channel = c1 +a1.sinks.k1.type = logger +---- + +For more flexibility, the default Flume client implementations +(`NettyAvroRpcClient` and `ThriftRpcClient`) can be configured with these +properties: + +[source,properties] +---- +client.type = default (for avro) or thrift (for thrift) + +hosts = h1 # default client accepts only 1 host + # (additional hosts will be ignored) + +hosts.h1 = host1.example.org:41414 # host and port must both be specified + # (neither has a default) + +batch-size = 100 # Must be >=1 (default: 100) + +connect-timeout = 20000 # Must be >=1000 (default: 20000) + +request-timeout = 20000 # Must be >=1000 (default: 20000) +---- + +==== Secure RPC client - Thrift + +As of Flume 1.6.0, Thrift source and sink supports kerberos based authentication. +The client needs to use the getThriftInstance method of `SecureRpcClientFactory` +to get hold of a `SecureThriftRpcClient`. `SecureThriftRpcClient` extends +`ThriftRpcClient` which implements the `RpcClient` interface. The kerberos +authentication module resides in flume-ng-auth module which is +required in classpath, when using the `SecureRpcClientFactory`. Both the client +principal and the client keytab should be passed in as parameters through the +properties and they reflect the credentials of the client to authenticate +against the kerberos KDC. In addition, the server principal of the destination +Thrift source to which this client is connecting to, should also be provided. +The following example shows how to use the `SecureRpcClientFactory` +within a user's data-generating application: + +[source,java] +---- +import org.apache.flume.Event; +import org.apache.flume.EventDeliveryException; +import org.apache.flume.event.EventBuilder; +import org.apache.flume.api.SecureRpcClientFactory; +import org.apache.flume.api.RpcClientConfigurationConstants; +import org.apache.flume.api.RpcClient; +import java.nio.charset.Charset; +import java.util.Properties; + +public class MyApp { + public static void main(String[] args) { + MySecureRpcClientFacade client = new MySecureRpcClientFacade(); + // Initialize client with the remote Flume agent's host, port + Properties props = new Properties(); + props.setProperty(RpcClientConfigurationConstants.CONFIG_CLIENT_TYPE, "thrift"); + props.setProperty("hosts", "h1"); + props.setProperty("hosts.h1", "client.example.org"+":"+ String.valueOf(41414)); + + // Initialize client with the kerberos authentication related properties + props.setProperty("kerberos", "true"); + props.setProperty("client-principal", "flumeclient/client.example.org@EXAMPLE.ORG"); + props.setProperty("client-keytab", "/tmp/flumeclient.keytab"); + props.setProperty("server-principal", "flume/server.example.org@EXAMPLE.ORG"); + client.init(props); + + // Send 10 events to the remote Flume agent. That agent should be + // configured to listen with an AvroSource. + String sampleData = "Hello Flume!"; + for (int i = 0; i < 10; i++) { + client.sendDataToFlume(sampleData); + } + + client.cleanUp(); + } +} + +class MySecureRpcClientFacade { + private RpcClient client; + private Properties properties; + + public void init(Properties properties) { + // Setup the RPC connection + this.properties = properties; + // Create the ThriftSecureRpcClient instance by using SecureRpcClientFactory + this.client = SecureRpcClientFactory.getThriftInstance(properties); + } + + public void sendDataToFlume(String data) { + // Create a Flume Event object that encapsulates the sample data + Event event = EventBuilder.withBody(data, Charset.forName("UTF-8")); + + // Send the event + try { + client.append(event); + } catch (EventDeliveryException e) { + // clean up and recreate the client + client.close(); + client = null; + client = SecureRpcClientFactory.getThriftInstance(properties); + } + } + + public void cleanUp() { + // Close the RPC connection + client.close(); + } +} +---- + +The remote `ThriftSource` should be started in kerberos mode. +Below is an example Flume agent configuration that's waiting for a connection +from MyApp: + +[source,properties] +---- +a1.channels = c1 +a1.sources = r1 +a1.sinks = k1 + +a1.channels.c1.type = memory + +a1.sources.r1.channels = c1 +a1.sources.r1.type = thrift +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = 41414 +a1.sources.r1.kerberos = true +a1.sources.r1.agent-principal = flume/server.example.org@EXAMPLE.ORG +a1.sources.r1.agent-keytab = /tmp/flume.keytab + + +a1.sinks.k1.channel = c1 +a1.sinks.k1.type = logger +---- + +==== Failover Client + +This class wraps the default Avro RPC client to provide failover handling +capability to clients. This takes a whitespace-separated list of ++<++host++>++:++<++port++>++ +representing the Flume agents that make-up a failover group. The Failover RPC +Client currently does not support thrift. If there’s a +communication error with the currently selected host (i.e. agent) agent, +then the failover client automatically fails-over to the next host in the list. +For example: + +[source,java] +---- +// Setup properties for the failover +Properties props = new Properties(); +props.put("client.type", "default_failover"); + +// List of hosts (space-separated list of user-chosen host aliases) +props.put("hosts", "h1 h2 h3"); + +// host/port pair for each host alias +String host1 = "host1.example.org:41414"; +String host2 = "host2.example.org:41414"; +String host3 = "host3.example.org:41414"; +props.put("hosts.h1", host1); +props.put("hosts.h2", host2); +props.put("hosts.h3", host3); + +// create the client with failover properties +RpcClient client = RpcClientFactory.getInstance(props); +---- + +For more flexibility, the failover Flume client implementation +(`FailoverRpcClient`) can be configured with these properties: + +[source,properties] +---- +client.type = default_failover + +hosts = h1 h2 h3 # at least one is required, but 2 or + # more makes better sense + +hosts.h1 = host1.example.org:41414 + +hosts.h2 = host2.example.org:41414 + +hosts.h3 = host3.example.org:41414 + +max-attempts = 3 # Must be >=0 (default: number of hosts + # specified, 3 in this case). A '0' + # value doesn't make much sense because + # it will just cause an append call to + # immmediately fail. A '1' value means + # that the failover client will try only + # once to send the Event, and if it + # fails then there will be no failover + # to a second client, so this value + # causes the failover client to + # degenerate into just a default client. + # It makes sense to set this value to at + # least the number of hosts that you + # specified. + +batch-size = 100 # Must be >=1 (default: 100) + +connect-timeout = 20000 # Must be >=1000 (default: 20000) + +request-timeout = 20000 # Must be >=1000 (default: 20000) +---- + +==== LoadBalancing RPC client + +The Flume Client SDK also supports an RpcClient which load-balances among +multiple hosts. This type of client takes a whitespace-separated list of +++<++host++>++:++<++port++>++ representing the Flume agents that make-up a load-balancing group. +This client can be configured with a load balancing strategy that either +randomly selects one of the configured hosts, or selects a host in a round-robin +fashion. You can also specify your own custom class that implements the +`LoadBalancingRpcClient$HostSelector` interface so that a custom selection +order is used. In that case, the FQCN of the custom class needs to be specified +as the value of the `host-selector` property. The LoadBalancing RPC Client +currently does not support thrift. + +If `backoff` is enabled then the client will temporarily blacklist +hosts that fail, causing them to be excluded from being selected as a failover +host until a given timeout. When the timeout elapses, if the host is still +unresponsive then this is considered a sequential failure, and the timeout is +increased exponentially to avoid potentially getting stuck in long waits on +unresponsive hosts. + +The maximum backoff time can be configured by setting `maxBackoff` (in +milliseconds). The maxBackoff default is 30 seconds (specified in the +`OrderSelector` class that's the superclass of both load balancing +strategies). The backoff timeout will increase exponentially with each +sequential failure up to the maximum possible backoff timeout. +The maximum possible backoff is limited to 65536 seconds (about 18.2 hours). +For example: + +[source,java] +---- +// Setup properties for the load balancing +Properties props = new Properties(); +props.put("client.type", "default_loadbalance"); + +// List of hosts (space-separated list of user-chosen host aliases) +props.put("hosts", "h1 h2 h3"); + +// host/port pair for each host alias +String host1 = "host1.example.org:41414"; +String host2 = "host2.example.org:41414"; +String host3 = "host3.example.org:41414"; +props.put("hosts.h1", host1); +props.put("hosts.h2", host2); +props.put("hosts.h3", host3); + +props.put("host-selector", "random"); // For random host selection +// props.put("host-selector", "round_robin"); // For round-robin host +// // selection +props.put("backoff", "true"); // Disabled by default. + +props.put("maxBackoff", "10000"); // Defaults 0, which effectively + // becomes 30000 ms + +// Create the client with load balancing properties +RpcClient client = RpcClientFactory.getInstance(props); +---- + +For more flexibility, the load-balancing Flume client implementation +(`LoadBalancingRpcClient`) can be configured with these properties: + +[source,properties] +---- +client.type = default_loadbalance + +hosts = h1 h2 h3 # At least 2 hosts are required + +hosts.h1 = host1.example.org:41414 + +hosts.h2 = host2.example.org:41414 + +hosts.h3 = host3.example.org:41414 + +backoff = false # Specifies whether the client should + # back-off from (i.e. temporarily + # blacklist) a failed host + # (default: false). + +maxBackoff = 0 # Max timeout in millis that a will + # remain inactive due to a previous + # failure with that host (default: 0, + # which effectively becomes 30000) + +host-selector = round_robin # The host selection strategy used + # when load-balancing among hosts + # (default: round_robin). + # Other values are include "random" + # or the FQCN of a custom class + # that implements + # LoadBalancingRpcClient$HostSelector + +batch-size = 100 # Must be >=1 (default: 100) + +connect-timeout = 20000 # Must be >=1000 (default: 20000) + +request-timeout = 20000 # Must be >=1000 (default: 20000) +---- + +=== Embedded agent + +Flume has an embedded agent api which allows users to embed an agent in their +application. This agent is meant to be lightweight and as such not all +sources, sinks, and channels are allowed. Specifically the source used +is a special embedded source and events should be send to the source +via the put, putAll methods on the EmbeddedAgent object. Only File Channel +and Memory Channel are allowed as channels while Avro Sink is the only +supported sink. Interceptors are also supported by the embedded agent. + +Note: The embedded agent has a dependency on hadoop-core.jar. + +Configuration of an Embedded Agent is similar to configuration of a +full Agent. The following is an exhaustive list of configration options: + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|source.type |embedded |The only available source is the embedded source. +|*channel.type* a| +--:: + to MemoryChannel + +a| +Either `memory` or `file` which correspond:: + and FileChannel respectively. + +|channel.++*++ |-- |Configuration options for the channel type requested, +|se |e MemoryChannel or |FileChannel user guide for an exhaustive list. +|*sinks* |-- |List of sink names +|*sink.type* |-- |Property name must match a name in the list of sinks. +|Va |lue must be ++``++avro |++``++ +|sink.++*++ |-- |Configuration options for the sink. +|Se |e AvroSink user gu |ide for an exhaustive list, +|ho |wever note AvroSin |k requires at least hostname and port. +|*processor.type* a| +--:: + to FailoverS + +|Either `failover` or `load++_++balance` which correspond +inksProcessor and LoadBalancingSinkProcessor respectively. +|processor.++*++ |-- |Configuration options for the sink processor selected. +|Se |e FailoverSinksPro |cessor and LoadBalancingSinkProcessor +|us |er guide for an ex |haustive list. +|source.interceptors |-- |Space-separated list of interceptors +|source.interceptors.++*++ |-- |Configuration options for individual interceptors +|sp |ecified in the sou |rce.interceptors property +|=== + +Below is an example of how to use the agent: + +[source,java] +---- +Map properties = new HashMap(); +properties.put("channel.type", "memory"); +properties.put("channel.capacity", "200"); +properties.put("sinks", "sink1 sink2"); +properties.put("sink1.type", "avro"); +properties.put("sink2.type", "avro"); +properties.put("sink1.hostname", "collector1.apache.org"); +properties.put("sink1.port", "5564"); +properties.put("sink2.hostname", "collector2.apache.org"); +properties.put("sink2.port", "5565"); +properties.put("processor.type", "load_balance"); +properties.put("source.interceptors", "i1"); +properties.put("source.interceptors.i1.type", "static"); +properties.put("source.interceptors.i1.key", "key1"); +properties.put("source.interceptors.i1.value", "value1"); + +EmbeddedAgent agent = new EmbeddedAgent("myagent"); + +agent.configure(properties); +agent.start(); + +List events = Lists.newArrayList(); + +events.add(event); +events.add(event); +events.add(event); +events.add(event); + +agent.putAll(events); + +... + +agent.stop(); +---- + +=== Transaction interface + +The `Transaction` interface is the basis of reliability for Flume. All the +major components (ie. `Source`s, `Sink`s and `Channel`s) must use a +Flume `Transaction`. + +image::DevGuide_image01.png[Transaction sequence diagram] + +A `Transaction` is implemented within a `Channel` implementation. Each +`Source` and `Sink` that is connected to a `Channel` must obtain a +`Transaction` object. The `Source`s use a `ChannelProcessor` +to manage the `Transaction`s, the `Sink`s manage them explicitly via +their configured `Channel`. The operation to stage an +`Event` (put it into a `Channel`) or extract an `Event` (take it out of a +`Channel`) is done inside an active `Transaction`. For example: + +[source,java] +---- +Channel ch = new MemoryChannel(); +Transaction txn = ch.getTransaction(); +txn.begin(); +try { + // This try clause includes whatever Channel operations you want to do + + Event eventToStage = EventBuilder.withBody("Hello Flume!", + Charset.forName("UTF-8")); + ch.put(eventToStage); + // Event takenEvent = ch.take(); + // ... + txn.commit(); +} catch (Throwable t) { + txn.rollback(); + + // Log exception, handle individual exceptions as needed + + // re-throw all Errors + if (t instanceof Error) { + throw (Error)t; + } +} finally { + txn.close(); +} +---- + +Here we get hold of a `Transaction` from a `Channel`. After `begin()` +returns, the `Transaction` is now active/open and the `Event` is then put +into the `Channel`. If the put is successful, then the `Transaction` is +committed and closed. + +=== Sink + +The purpose of a `Sink` to extract `Event`s from the `Channel` and +forward them to the next Flume Agent in the flow or store them in an external +repository. A `Sink` is associated with exactly one `Channel`s, as +configured in the Flume properties file. There’s one `SinkRunner` instance +associated with every configured `Sink`, and when the Flume framework calls +`SinkRunner.start()`, a new thread is created to drive the `Sink` (using +`SinkRunner.PollingRunner` as the thread's `Runnable`). This thread manages +the `Sink`’s lifecycle. The `Sink` needs to implement the `start()` and +`stop()` methods that are part of the `LifecycleAware` interface. The +`Sink.start()` method should initialize the `Sink` and bring it to a state +where it can forward the `Event`s to its next destination. The +`Sink.process()` method should do the core processing of extracting the +`Event` from the `Channel` and forwarding it. The `Sink.stop()` method +should do the necessary cleanup (e.g. releasing resources). The `Sink` +implementation also needs to implement the `Configurable` interface for +processing its own configuration settings. For example: + +[source,java] +---- +public class MySink extends AbstractSink implements Configurable { + private String myProp; + + @Override + public void configure(Context context) { + String myProp = context.getString("myProp", "defaultValue"); + + // Process the myProp value (e.g. validation) + + // Store myProp for later retrieval by process() method + this.myProp = myProp; + } + + @Override + public void start() { + // Initialize the connection to the external repository (e.g. HDFS) that + // this Sink will forward Events to .. + } + + @Override + public void stop () { + // Disconnect from the external respository and do any + // additional cleanup (e.g. releasing resources or nulling-out + // field values) .. + } + + @Override + public Status process() throws EventDeliveryException { + Status status = null; + + // Start transaction + Channel ch = getChannel(); + Transaction txn = ch.getTransaction(); + txn.begin(); + try { + // This try clause includes whatever Channel operations you want to do + + Event event = ch.take(); + + // Send the Event to the external repository. + // storeSomeData(e); + + txn.commit(); + status = Status.READY; + } catch (Throwable t) { + txn.rollback(); + + // Log exception, handle individual exceptions as needed + + status = Status.BACKOFF; + + // re-throw all Errors + if (t instanceof Error) { + throw (Error)t; + } + } + return status; + } +} +---- + +=== Source + +The purpose of a `Source` is to receive data from an external client and store +it into the configured `Channel`s. A `Source` can get an instance of its own +`ChannelProcessor` to process an `Event`, commited within a `Channel` +local transaction, in serial. In the case of an exception, required +`Channel`s will propagate the exception, all `Channel`s will rollback their +transaction, but events processed previously on other `Channel`s will remain +committed. + +Similar to the `SinkRunner.PollingRunner` `Runnable`, there’s +a `PollingRunner` `Runnable` that executes on a thread created when the +Flume framework calls `PollableSourceRunner.start()`. Each configured +`PollableSource` is associated with its own thread that runs a +`PollingRunner`. This thread manages the `PollableSource`’s lifecycle, +such as starting and stopping. A `PollableSource` implementation must +implement the `start()` and `stop()` methods that are declared in the +`LifecycleAware` interface. The runner of a `PollableSource` invokes that +`Source`'s `process()` method. The `process()` method should check for +new data and store it into the `Channel` as Flume `Event`s. + +Note that there are actually two types of `Source`s. The `PollableSource` +was already mentioned. The other is the `EventDrivenSource`. The +`EventDrivenSource`, unlike the `PollableSource`, must have its own callback +mechanism that captures the new data and stores it into the `Channel`. The +`EventDrivenSource`s are not each driven by their own thread like the +`PollableSource`s are. Below is an example of a custom `PollableSource`: + +[source,java] +---- +public class MySource extends AbstractSource implements Configurable, PollableSource { + private String myProp; + + @Override + public void configure(Context context) { + String myProp = context.getString("myProp", "defaultValue"); + + // Process the myProp value (e.g. validation, convert to another type, ...) + + // Store myProp for later retrieval by process() method + this.myProp = myProp; + } + + @Override + public void start() { + // Initialize the connection to the external client + } + + @Override + public void stop () { + // Disconnect from external client and do any additional cleanup + // (e.g. releasing resources or nulling-out field values) .. + } + + @Override + public Status process() throws EventDeliveryException { + Status status = null; + + try { + // This try clause includes whatever Channel/Event operations you want to do + + // Receive new data + Event e = getSomeData(); + + // Store the Event into this Source's associated Channel(s) + getChannelProcessor().processEvent(e); + + status = Status.READY; + } catch (Throwable t) { + // Log exception, handle individual exceptions as needed + + status = Status.BACKOFF; + + // re-throw all Errors + if (t instanceof Error) { + throw (Error)t; + } + } finally { + txn.close(); + } + return status; + } +} +---- + +=== Channel + +TBD + +=== Initializable + +As of Flume 1.10.0 Sources, Sinks, and Channels may implement the Intitializable interface. Doing so +allows the component to have access the materialized configuration before any of the components have been +started. While this ability is quite useful when using the standard configuration, it is less useful when +configuring using Spring Boot as Spring's autowiring generally can be used to accomplish the same thing. + +This example shows a Sink being configured with the name of a Source. While initializing it will +retrieve the Source from the configuration and save it. During event processing a new event will be +sent to the Source, presumably after the event has be modified in some way. + +[source,java] +---- +public class NullInitSink extends NullSink implements Initializable { + + private static final Logger logger = LoggerFactory.getLogger(NullInitSink.class); + private String sourceName = null; + private EventProcessor eventProcessor = null; + private long total = 0; + + public NullInitSink() { + super(); + } + + @Override + public void configure(Context context) { + sourceName = context.getString("targetSource"); + super.configure(context); + + } + + @Override + public void initialize(MaterializedConfiguration configuration) { + logger.debug("Locating source for event publishing"); + for (Map.Entry entry : configuration.getSourceRunners().entrySet()) { + if (entry.getKey().equals(sourceName)) { + Source source = entry.getValue().getSource(); + if (source instanceof EventProcessor) { + eventProcessor = (EventProcessor) source; + logger.debug("Found event processor {}", source.getName()); + return; + } + } + } + logger.warn("No Source named {} found for republishing events.", sourceName); + } + + @Override + public Status process() throws EventDeliveryException { + Status status = Status.READY; + + Channel channel = getChannel(); + Transaction transaction = channel.getTransaction(); + Event event = null; + CounterGroup counterGroup = getCounterGroup(); + long batchSize = getBatchSize(); + long eventCounter = counterGroup.get("events.success"); + + try { + transaction.begin(); + int i = 0; + for (i = 0; i < batchSize; i++) { + event = channel.take(); + if (event != null) { + long id = Long.parseLong(new String(event.getBody())); + total += id; + event.getHeaders().put("Total", Long.toString(total)); + eventProcessor.processEvent(event); + logger.info("Null sink {} successful processed event {}", getName(), id); + } else { + status = Status.BACKOFF; + break; + } + } + transaction.commit(); + counterGroup.addAndGet("events.success", (long) Math.min(batchSize, i)); + counterGroup.incrementAndGet("transaction.success"); + } catch (Exception ex) { + transaction.rollback(); + counterGroup.incrementAndGet("transaction.failed"); + logger.error("Failed to deliver event. Exception follows.", ex); + throw new EventDeliveryException("Failed to deliver event: " + event, ex); + } finally { + transaction.close(); + } + + return status; + } +} +---- diff --git a/src/site/antora/modules/ROOT/pages/FlumeUserGuide.adoc b/src/site/antora/modules/ROOT/pages/FlumeUserGuide.adoc new file mode 100644 index 0000000000..72d2428cdd --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/FlumeUserGuide.adoc @@ -0,0 +1,5832 @@ +//// + 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. +//// + += Flume 1.11.0 User Guide + +== Introduction + +=== Overview + +Apache Flume is a distributed, reliable, and available system for efficiently +collecting, aggregating and moving large amounts of log data from many +different sources to a centralized data store. + +The use of Apache Flume is not only restricted to log data aggregation. +Since data sources are customizable, Flume can be used to transport massive quantities +of event data including but not limited to network traffic data, social-media-generated data, +email messages and pretty much any data source possible. + +Apache Flume is a top level project at the Apache Software Foundation. + +=== System Requirements + +. Java Runtime Environment - Java 1.8 or later +. Memory - Sufficient memory for configurations used by sources, channels or sinks +. Disk Space - Sufficient disk space for configurations used by channels or sinks +. Directory Permissions - Read/Write permissions for directories used by agent + +=== Architecture + +==== Data flow model + +A Flume event is defined as a unit of data flow having a byte payload and an +optional set of string attributes. A Flume agent is a (JVM) process that hosts +the components through which events flow from an external source to the next +destination (hop). + +image::UserGuide_image00.png[Agent component diagram] + +A Flume source consumes events delivered to it by an external source like a web +server. The external source sends events to Flume in a format that is +recognized by the target Flume source. For example, an Avro Flume source can be +used to receive Avro events from Avro clients or other Flume agents in the flow +that send events from an Avro sink. A similar flow can be defined using +a Thrift Flume Source to receive events from a Thrift Sink or a Flume +Thrift Rpc Client or Thrift clients written in any language generated from +the Flume thrift protocol.When a Flume source receives an event, it +stores it into one or more channels. The channel is a passive store that keeps +the event until it's consumed by a Flume sink. The file channel is one example +-- it is backed by the local filesystem. The sink removes the event +from the channel and puts it into an external repository like HDFS (via Flume +HDFS sink) or forwards it to the Flume source of the next Flume agent (next +hop) in the flow. The source and sink within the given agent run asynchronously +with the events staged in the channel. + +==== Complex flows + +Flume allows a user to build multi-hop flows where events travel through +multiple agents before reaching the final destination. It also allows fan-in +and fan-out flows, contextual routing and backup routes (fail-over) for failed +hops. + +==== Reliability + +The events are staged in a channel on each agent. The events are then delivered +to the next agent or terminal repository (like HDFS) in the flow. The events +are removed from a channel only after they are stored in the channel of next +agent or in the terminal repository. This is a how the single-hop message +delivery semantics in Flume provide end-to-end reliability of the flow. + +Flume uses a transactional approach to guarantee the reliable delivery of the +events. The sources and sinks encapsulate in a transaction the +storage/retrieval, respectively, of the events placed in or provided by a +transaction provided by the channel. This ensures that the set of events are +reliably passed from point to point in the flow. In the case of a multi-hop +flow, the sink from the previous hop and the source from the next hop both have +their transactions running to ensure that the data is safely stored in the +channel of the next hop. + +==== Recoverability + +The events are staged in the channel, which manages recovery from failure. +Flume supports a durable file channel which is backed by the local file system. +There's also a memory channel which simply stores the events in an in-memory +queue, which is faster but any events still left in the memory channel when an +agent process dies can't be recovered. + +Flume's [.title-ref]#KafkaChannel# uses Apache Kafka to stage events. Using a replicated +Kafka topic as a channel helps avoiding event loss in case of a disk failure. + +== Standard Setup + +This section documents how to configure and wire Flume components using Flume's +long-standing configuration techniques using properties files. See the following +section for creating a Flume application using Spring Boot. + +=== Setting up an agent + +Flume agent configuration is stored in one or more configuration files that +follow the Java properties file format. Configurations for one or more agents +can be specified in these configuration files. The configuration includes +properties of each source, sink and channel in an agent and how they are wired +together to form data flows. + +==== Configuring individual components + +Each component (source, sink or channel) in the flow has a name, type, and set +of properties that are specific to the type and instantiation. For example, an +Avro source needs a hostname (or IP address) and a port number to receive data +from. A memory channel can have max queue size ("capacity"), and an HDFS sink +needs to know the file system URI, path to create files, frequency of file +rotation ("hdfs.rollInterval") etc. All such attributes of a component needs to +be set in the properties file of the hosting Flume agent. + +==== Wiring the pieces together + +The agent needs to know what individual components to load and how they are +connected in order to constitute the flow. This is done by listing the names of +each of the sources, sinks and channels in the agent, and then specifying the +connecting channel for each sink and source. For example, an agent flows events +from an Avro source called avroWeb to HDFS sink hdfs-cluster1 via a file +channel called file-channel. The configuration file will contain names of these +components and file-channel as a shared channel for both avroWeb source and +hdfs-cluster1 sink. + +==== Starting an agent + +An agent is started using a shell script called flume-ng which is located in +the bin directory of the Flume distribution. You need to specify the agent +name, the config directory, and the config file on the command line: + +.... +$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template +.... + +Now the agent will start running source and sinks configured in the given +properties file. + +==== A simple example + +Here, we give an example configuration file, describing a single-node Flume deployment. +This configuration lets a user generate events and subsequently logs them to the console. + +[source,properties] +---- +# example.conf: A single-node Flume configuration + +# Name the components on this agent +a1.sources = r1 +a1.sinks = k1 +a1.channels = c1 + +# Describe/configure the source +a1.sources.r1.type = netcat +a1.sources.r1.bind = localhost +a1.sources.r1.port = 44444 + +# Describe the sink +a1.sinks.k1.type = logger + +# Use a channel which buffers events in memory +a1.channels.c1.type = memory +a1.channels.c1.capacity = 1000 +a1.channels.c1.transactionCapacity = 100 + +# Bind the source and sink to the channel +a1.sources.r1.channels = c1 +a1.sinks.k1.channel = c1 +---- + +This configuration defines a single agent named a1. a1 has a source that listens for data on port 44444, a channel +that buffers event data in memory, and a sink that logs event data to the console. The configuration file names the +various components, then describes their types and configuration parameters. A given configuration file might define +several named agents; when a given Flume process is launched a flag is passed telling it which named agent to manifest. + +Given this configuration file, we can start Flume as follows: + +.... +$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 +.... + +Note that in a full deployment we would typically include one more option: `--conf=++<++conf-dir++>++`. +The `++<++conf-dir++>++` directory would include a shell script _flume-env.sh_ and potentially a log4j configuration file. + +From a separate terminal, we can then telnet port 44444 and send Flume an event: + +[source,properties] +---- +$ telnet localhost 44444 +Trying 127.0.0.1... +Connected to localhost.localdomain (127.0.0.1). +Escape character is '^]'. +Hello world! +OK +---- + +The original Flume terminal will output the event in a log message. + +[source,properties] +---- +12/06/19 15:32:19 INFO source.NetcatSource: Source starting +12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444] +12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D Hello world!. } +---- + +Congratulations - you've successfully configured and deployed a Flume agent! Subsequent sections cover agent configuration in much more detail. + +==== Configuration from URIs + +As of version 1.10.0 Flume supports being configured using URIs instead of just from local files. Direct support +for HTTP(S), file, and classpath URIs is included. The HTTP support includes support for authentication using +basic authorization but other authorization mechanisms may be supported by specifying the fully qualified name +of the class that implements the AuthorizationProvider interface using the --auth-provider option. HTTP also +supports reloading of configuration files using polling if the target server properly responds to the If-Modified-Since +header. + +To specify credentials for HTTP authentication add: + +.... +--conf-user userid --conf-password password +.... + +to the startup command. + +==== Multiple Configuration Files + +As of version 1.10.0 Flume supports being configured from multiple configuration files instead of just one. +This more easily allows values to be overridden or added based on specific environments. Each file should +be configured using its own --conf-file or --conf-uri option. However, all files should either be provided +with --conf-file or with --conf-uri. If --conf-file and --conf-uri appear together as options all --conf-uri +configurations will be processed before any of the --conf-file configurations are merged. + +For example, a configuration of: + +.... +$ bin/flume-ng agent --conf conf --conf-file example.conf --conf-uri http://localhost:80/flume.conf --conf-uri http://localhost:80/override.conf --name a1 +.... + +will cause flume.conf to be read first, override.conf to be merged with it and finally example.conf would be +merged last. If it is desirec to have example.conf be the base configuration it should be specified using the +--conf-uri option either as: + +.... +--conf-uri classpath://example.conf +or +--conf-uri file:///example.conf +.... + +depending on how it should be accessed. + +==== Using environment variables, system properies, or other properties configuration files + +Flume has the ability to substitute environment variables in the configuration. For example: + +.... +a1.sources = r1 +a1.sources.r1.type = netcat +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = ${env:NC_PORT} +a1.sources.r1.channels = c1 +.... + +NB: it currently works for values only, not for keys. (Ie. only on the "right side" of the [.title-ref]#=# mark of the config lines.) + +As of version 1.10.0 Flume resolves configuration values using Apache Commons Text's StringSubstitutor +class using the default set of Lookups along with a lookup that uses the configuration files as a +source for replacement values. + +For example:::: + $ NC++_++PORT=44444 bin/flume-ng agent --conf conf --conf-file example.conf --name a1 + +Note the above is just an example, environment variables can be configured in other ways, including being set in [.title-ref]#conf/flume-env.sh#. + +As noted, system properties are also supported, so the configuration: + +.... +a1.sources = r1 +a1.sources.r1.type = netcat +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = ${sys:NC_PORT} +a1.sources.r1.channels = c1 +.... + +could be used and the startup command could be: + +.... +$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -DNC_PORT=44444 +.... + +Furthermore, because multiple configuration files are allowed the first file could contain: + +.... +a1.sources = r1 +a1.sources.r1.type = netcat +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = ${NC_PORT} +a1.sources.r1.channels = c1 +.... + +and the override file could contain: + +.... +NC_PORT = 44444 +.... + +In this case the startup command could be: + +.... +$ bin/flume-ng agent --conf conf --conf-file example.conf --conf-file override.conf --name a1 +.... + +Note that the method for specifying environment variables as was done in prior versions will stil work +but has been deprecated in favor of using $++{++env:varName}. + +==== Using a command options file + +Instead of specifying all the command options on the command line as of version 1.10.0 command +options may be placed in either /etc/flume/flume.opts or flume.opts on the classpath. An example +might be: + +.... +conf-file = example.conf +conf-file = override.conf +name = a1 +.... + +==== Logging raw data + +Logging the raw stream of data flowing through the ingest pipeline is not desired behavior in +many production environments because this may result in leaking sensitive data or security related +configurations, such as secret keys, to Flume log files. +By default, Flume will not log such information. On the other hand, if the data pipeline is broken, +Flume will attempt to provide clues for debugging the problem. + +One way to debug problems with event pipelines is to set up an additional link:#memory-channel[Memory Channel] +connected to a link:#logger-sink[Logger Sink], which will output all event data to the Flume logs. +In some situations, however, this approach is insufficient. + +In order to enable logging of event- and configuration-related data, some Java system properties +must be set in addition to log4j properties. + +To enable configuration-related logging, set the Java system property +`-Dorg.apache.flume.log.printconfig=true`. This can either be passed on the command line or by +setting this in the `JAVA++_++OPTS` variable in _flume-env.sh_. + +To enable data logging, set the Java system property `-Dorg.apache.flume.log.rawdata=true` +in the same way described above. For most components, the log4j logging level must also be set to +DEBUG or TRACE to make event-specific logging appear in the Flume logs. + +Here is an example of enabling both configuration logging and raw data logging: + +.... +$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dorg.apache.flume.log.printconfig=true -Dorg.apache.flume.log.rawdata=true +.... + +==== Zookeeper based Configuration + +Flume supports Agent configurations via Zookeeper. _This is an experimental feature._ The configuration file needs to be uploaded +in the Zookeeper, under a configurable prefix. The configuration file is stored in Zookeeper Node data. +Following is how the Zookeeper Node tree would look like for agents a1 and a2 + +[source,properties] +---- +- /flume + |- /a1 [Agent config file] + |- /a2 [Agent config file] +---- + +Once the configuration file is uploaded, start the agent with following options + +____ +$ bin/flume-ng agent --conf conf -z zkhost:2181,zkhost1:2181 -p /flume --name a1 +____ + +[cols=",,",options="header",] +|=== +|Argument Name |Default |Description +|*z* |-- |Zookeeper connection string. Comma separated list of hostname:port +|*p* |/flume |Base Path in Zookeeper to store Agent configurations +|=== + +==== Installing third-party plugins + +Flume has a fully plugin-based architecture. While Flume ships with many +out-of-the-box sources, channels, sinks, serializers, and the like, many +implementations exist which ship separately from Flume. + +While it has always been possible to include custom Flume components by +adding their jars to the FLUME++_++CLASSPATH variable in the flume-env.sh file, +Flume now supports a special directory called `plugins.d` which automatically +picks up plugins that are packaged in a specific format. This allows for easier +management of plugin packaging issues as well as simpler debugging and +troubleshooting of several classes of issues, especially library dependency +conflicts. + +===== The plugins.d directory + +The `plugins.d` directory is located at `$FLUME++_++HOME/plugins.d`. At startup +time, the `flume-ng` start script looks in the `plugins.d` directory for +plugins that conform to the below format and includes them in proper paths when +starting up `java`. + +===== Directory layout for plugins + +Each plugin (subdirectory) within `plugins.d` can have up to three +sub-directories: + +. lib - the plugin's jar(s) +. libext - the plugin's dependency jar(s) +. native - any required native libraries, such as `.so` files + +Example of two plugins within the plugins.d directory: + +[source,none] +---- +plugins.d/ +plugins.d/custom-source-1/ +plugins.d/custom-source-1/lib/my-source.jar +plugins.d/custom-source-1/libext/spring-core-2.5.6.jar +plugins.d/custom-source-2/ +plugins.d/custom-source-2/lib/custom.jar +plugins.d/custom-source-2/native/gettext.so +---- + +=== Data ingestion + +Flume supports a number of mechanisms to ingest data from external sources. + +==== RPC + +An Avro client included in the Flume distribution can send a given file to +Flume Avro source using avro RPC mechanism: + +.... +$ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10 +.... + +The above command will send the contents of /usr/logs/log.10 to to the Flume +source listening on that ports. + +==== Executing commands + +There's an exec source that executes a given command and consumes the output. A +single 'line' of output ie. text followed by carriage return ('++\++r') or line +feed ('++\++n') or both together. + +==== Network streams + +Flume supports the following mechanisms to read data from popular log stream +types, such as: + +. Avro +. Thrift +. Syslog +. Netcat + +=== Setting multi-agent flow + +image::UserGuide_image03.png[Two agents communicating over Avro RPC] + +In order to flow the data across multiple agents or hops, the sink of the +previous agent and source of the current hop need to be avro type with the sink +pointing to the hostname (or IP address) and port of the source. + +=== Consolidation + +A very common scenario in log collection is a large number of log producing +clients sending data to a few consumer agents that are attached to the storage +subsystem. For example, logs collected from hundreds of web servers sent to a +dozen of agents that write to HDFS cluster. + +image::UserGuide_image02.png[A fan-in flow using Avro RPC to consolidate events in one place] + +This can be achieved in Flume by configuring a number of first tier agents with +an avro sink, all pointing to an avro source of single agent (Again you could +use the thrift sources/sinks/clients in such a scenario). This source +on the second tier agent consolidates the received events into a single +channel which is consumed by a sink to its final destination. + +=== Multiplexing the flow + +Flume supports multiplexing the event flow to one or more destinations. This is +achieved by defining a flow multiplexer that can replicate or selectively route +an event to one or more channels. + +image::UserGuide_image01.png[A fan-out flow using a (multiplexing) channel selector] + +The above example shows a source from agent "foo" fanning out the flow to three +different channels. This fan out can be replicating or multiplexing. In case of +replicating flow, each event is sent to all three channels. For the +multiplexing case, an event is delivered to a subset of available channels when +an event's attribute matches a preconfigured value. For example, if an event +attribute called "txnType" is set to "customer", then it should go to channel1 +and channel3, if it's "vendor" then it should go to channel2, otherwise +channel3. The mapping can be set in the agent's configuration file. + +== Spring Boot Setup + +Apache Flume provides the flume-spring-boot module to provide support for packaging and +configuring an application using Spring Boot. Version 2.0.0 or greater of flume-spring-boot +should be used. + +Flume "normally" follows a paradigm where each component implements the Configurable +interface and must implement the configure method to configure itself by retrieving +the configuration attributes from its Context's properties. In contrast, +Spring and Spring Boot normally rely on dependency injection. where the configuration +values are set into the object being configured either as constructor parameters or +via setter methods. + +Flume's integration with Spring Boot provides support to configure Flume components +in the application's properties via the normal application.yml. Unlike Flume's +default method of configuring however, only component attributes are specified in +the application.yml. Wiring components together, and thus defining the flows, is +handled via Spring's Java configuration. + +=== Creating the application + +Flume's Spring Boot support provides the main class to be configured with spring as +[.title-ref]#org.apache.flume.spring.boot.FlumeApplication#. Flume applications that use Spring +Boot should configure the Spring Boot Maven plugin with that as the main class as in: + +.... + + repackage + + repackage + + + true + org.apache.flume.spring.boot.FlumeApplication + + +.... + +=== Component Scanning + +Spring Boot will automatically locate all the Spring components provided by Flume. +However, in order for the Flume application to be configured Spring needs the +configuration and package names used by the application in order for Spring to locate +these components.This is accomplished in the application by providing a META-INF/spring.factories +file that enables auto configuration for one class that will then provide the component +scanning information for the rest of the application. For example: + +META-INF/spring.factories: + +.... +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sample.myapp.config.AppConfig +.... + +com.sample.config.AppConfig.java: + +.... +package com.sample.myapp.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages="com.sample.myapp") +public class MyConfiguration { + +} +.... + +This will result in all classes in the [.title-ref]#com.sample.myapp# package and +it++`++s sub-packages being scanned by Spring for components to be included. Note +that classes found there may also use Spring's [.title-ref]#@Import# annotation to include +classes in other packages. + +=== Component Wiring + +Flume's Spring Boot support will automatically gather all the defined Channels, +SourceRunners, and SinkRunners and start them. To do that they all must first +be created as Spring Singletons using the Spring [.title-ref]#@Bean# annotation in a class +containing the [.title-ref]#@Configuration# annotation on the class declaration and then +initialize them just as the "normal" FlumeApplication class does. To define +these components an application should provide a Configuration class that +creates these Flume components. An example configuration that generates +sequence numbers, writes them to a MemoryChannel and then consumes these events +without publishing them anywhere would look like: + +.... +@Configuration +@ComponentScan(basePackages="com.sample.myapp") +public class AppConfig extends AbstractFlumeConfiguration { + + @Bean + @ConfigurationProperties(prefix = "flume.sources.source1") + public Map source1Properties() { + return new HashMap<>(); + } + + @Bean + @ConfigurationProperties(prefix = "flume.channels.channel1") + public Map channel1Properties() { + return new HashMap<>(); + } + + @Bean + public Channel memoryChannel(Map channel1Properties) { + return configureChannel("channel1", MemoryChannel.class, channel1Properties); + } + + @Bean + public SourceRunner seqSource(Channel memoryChannel, Map source1Properties) { + ChannelSelector selector = new ReplicatingChannelSelector(); + selector.setChannels(listOf(memoryChannel)); + return configureSource("source1", SequenceGeneratorSource.class, selector, + source1Properties); + } + + @Bean + public SinkRunner nullSink(Channel memoryChannel) { + Sink sink = configureSink("null", NullSink.class, memoryChannel,null); + return createSinkRunner(configureSinkProcessor(null, DefaultSinkProcessor.class, + listOf(sink))); + } +} +.... + +The configuration for this configuration might look like: + +.... +spring: + application: + name: flume-test + +server: + port: 41414 + +flume: + metrics: http + sources: + source1: + totalEvents: 10000 + channels: + channel1: + capacity: 10000 +.... + +This would result in an application named "flume-test" that listens on port 41414 for the /metrics endpoint. +10,000 events would be written to the channel. These events would be consumed by the NullSink. The Configuration +class should extend AbstractFlumeConfiguration, as shown here, to be able to use the helper classes that +construct the appropriate Flume components. + +Note that all Spring Boot facilities are available to Flume applications configured this way. + +SinkGroups and Sinks may also be configured in a similar fashion as in: + +.... +flume: + sinkGroups: + rrobin: + backoff: true + selector: round_robin + "selector.maxTimeOut": 30000 + + sinks: + avroSinks: + avroSink1: + hostname: 192.168.10.10 + port: 4141 + batch-size: 100 + compression-type: deflate + avroSink2: + hostname: 192.168.10.11 + port: 4141 + batch-size: 100 + compression-type: deflate +.... + +These would be configured in the Java config with: + +.... +@Bean +@ConfigurationProperties(prefix = "flume.sink-groups.rrobin") +public Map rrobinProperties() { + return new HashMap<>(); +} + +@Bean +@ConfigurationProperties(prefix = "flume.sinks.avro-sinks") +public Map avroSinksProperties() { + return new HashMap<>(); +} + +@Bean +public List avroSinks(final Channel avroFileChannel, + final Map avroSinksProperties) { + List sinks = new ArrayList<>(); + for (Map.Entry entry : avroSinksProperties.entrySet()) { + sinks.add(configureSink(entry.getKey(), AvroSink.class, avroFileChannel, + entry.getValue().getProperties())); + } + return sinks; +} + +@Bean +public SinkRunner avroSinkRunner(final Map rrobinProperties, final List avroSinks) { + return createSinkRunner( + configureSinkProcessor(rrobinProperties, LoadBalancingSinkProcessor.class, avroSinks)); +} +.... + +Note that the attribute names specified for the sources, channels, and sink groups must match the attribute names +specified for the components in other portions of this documentation. + +It is important to note that a concrete class was used to capture the data for the Avro Sinks. When a simple Map +is used Spring seems to get confused with the nested Maps. The [.title-ref]#AvroSinkConfiguration# class would look like: + +.... +public class AvroSinkConfiguration { + + private String hostName; + private int port; + private int batchSize; + private String compressionType; + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public String getCompressionType() { + return compressionType; + } + + public void setCompressionType(String compressionType) { + this.compressionType = compressionType; + } + + public Map getProperties() { + Map map = new HashMap<>(); + map.put("hostname", hostName); + map.put("port", Integer.toString(port)); + map.put("batchSize", Integer.toString(batchSize)); + map.put(compressionType, compressionType); + return map; + } +} +.... + +== Configuration + +As mentioned in the earlier section, standard Flume agent configuration is +read from a file that resembles a Java property file format with hierarchical property +settings. + +=== Defining the flow + +To define the flow within a single agent, you need to link the sources and +sinks via a channel. You need to list the sources, sinks and channels for the +given agent, and then point the source and sink to a channel. A source instance +can specify multiple channels, but a sink instance can only specify one channel. +The format is as follows: + +[source,properties] +---- +# list the sources, sinks and channels for the agent +.sources = +.sinks = +.channels = + +# set channel for source +.sources..channels = ... + +# set channel for sink +.sinks..channel = +---- + +For example, an agent named agent++_++foo is reading data from an external avro client and sending +it to HDFS via a memory channel. The config file weblog.config could look like: + +[source,properties] +---- +# list the sources, sinks and channels for the agent +agent_foo.sources = avro-appserver-src-1 +agent_foo.sinks = hdfs-sink-1 +agent_foo.channels = mem-channel-1 + +# set channel for source +agent_foo.sources.avro-appserver-src-1.channels = mem-channel-1 + +# set channel for sink +agent_foo.sinks.hdfs-sink-1.channel = mem-channel-1 +---- + +This will make the events flow from avro-AppSrv-source to hdfs-Cluster1-sink +through the memory channel mem-channel-1. When the agent is started with the +weblog.config as its config file, it will instantiate that flow. + +=== Configuring individual components + +After defining the flow, you need to set properties of each source, sink and +channel. This is done in the same hierarchical namespace fashion where you set +the component type and other values for the properties specific to each +component: + +[source,properties] +---- +# properties for sources +.sources.. = + +# properties for channels +.channels.. = + +# properties for sinks +.sinks.. = +---- + +The property "type" needs to be set for each component for Flume to understand +what kind of object it needs to be. Each source, sink and channel type has its +own set of properties required for it to function as intended. All those need +to be set as needed. In the previous example, we have a flow from +avro-AppSrv-source to hdfs-Cluster1-sink through the memory channel +mem-channel-1. Here's an example that shows configuration of each of those +components: + +[source,properties] +---- +agent_foo.sources = avro-AppSrv-source +agent_foo.sinks = hdfs-Cluster1-sink +agent_foo.channels = mem-channel-1 + +# set channel for sources, sinks + +# properties of avro-AppSrv-source +agent_foo.sources.avro-AppSrv-source.type = avro +agent_foo.sources.avro-AppSrv-source.bind = localhost +agent_foo.sources.avro-AppSrv-source.port = 10000 + +# properties of mem-channel-1 +agent_foo.channels.mem-channel-1.type = memory +agent_foo.channels.mem-channel-1.capacity = 1000 +agent_foo.channels.mem-channel-1.transactionCapacity = 100 + +# properties of hdfs-Cluster1-sink +agent_foo.sinks.hdfs-Cluster1-sink.type = hdfs +agent_foo.sinks.hdfs-Cluster1-sink.hdfs.path = hdfs://namenode/flume/webdata + +#... +---- + +=== Adding multiple flows in an agent + +A single Flume agent can contain several independent flows. You can list +multiple sources, sinks and channels in a config. These components can be +linked to form multiple flows: + +[source,properties] +---- +# list the sources, sinks and channels for the agent +.sources = +.sinks = +.channels = +---- + +Then you can link the sources and sinks to their corresponding channels (for +sources) or channel (for sinks) to setup two different flows. For example, if +you need to setup two flows in an agent, one going from an external avro client +to external HDFS and another from output of a tail to avro sink, then here's a +config to do that: + +[source,properties] +---- +# list the sources, sinks and channels in the agent +agent_foo.sources = avro-AppSrv-source1 exec-tail-source2 +agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2 +agent_foo.channels = mem-channel-1 file-channel-2 + +# flow #1 configuration +agent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1 +agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1 + +# flow #2 configuration +agent_foo.sources.exec-tail-source2.channels = file-channel-2 +agent_foo.sinks.avro-forward-sink2.channel = file-channel-2 +---- + +=== Configuring a multi agent flow + +To setup a multi-tier flow, you need to have an avro/thrift sink of first hop +pointing to avro/thrift source of the next hop. This will result in the first +Flume agent forwarding events to the next Flume agent. For example, if you are +periodically sending files (1 file per event) using avro client to a local +Flume agent, then this local agent can forward it to another agent that has the +mounted for storage. + +Weblog agent config: + +[source,properties] +---- +# list sources, sinks and channels in the agent +agent_foo.sources = avro-AppSrv-source +agent_foo.sinks = avro-forward-sink +agent_foo.channels = file-channel + +# define the flow +agent_foo.sources.avro-AppSrv-source.channels = file-channel +agent_foo.sinks.avro-forward-sink.channel = file-channel + +# avro sink properties +agent_foo.sinks.avro-forward-sink.type = avro +agent_foo.sinks.avro-forward-sink.hostname = 10.1.1.100 +agent_foo.sinks.avro-forward-sink.port = 10000 + +# configure other pieces +#... +---- + +HDFS agent config: + +[source,properties] +---- +# list sources, sinks and channels in the agent +agent_foo.sources = avro-collection-source +agent_foo.sinks = hdfs-sink +agent_foo.channels = mem-channel + +# define the flow +agent_foo.sources.avro-collection-source.channels = mem-channel +agent_foo.sinks.hdfs-sink.channel = mem-channel + +# avro source properties +agent_foo.sources.avro-collection-source.type = avro +agent_foo.sources.avro-collection-source.bind = 10.1.1.100 +agent_foo.sources.avro-collection-source.port = 10000 + +# configure other pieces +#... +---- + +Here we link the avro-forward-sink from the weblog agent to the +avro-collection-source of the hdfs agent. This will result in the events coming +from the external appserver source eventually getting stored in HDFS. + +=== Fan out flow + +As discussed in previous section, Flume supports fanning out the flow from one +source to multiple channels. There are two modes of fan out, replicating and +multiplexing. In the replicating flow, the event is sent to all the configured +channels. In case of multiplexing, the event is sent to only a subset of +qualifying channels. To fan out the flow, one needs to specify a list of +channels for a source and the policy for the fanning it out. This is done by +adding a channel "selector" that can be replicating or multiplexing. Then +further specify the selection rules if it's a multiplexer. If you don't specify +a selector, then by default it's replicating: + +[source,properties] +---- +# List the sources, sinks and channels for the agent +.sources = +.sinks = +.channels = + +# set list of channels for source (separated by space) +.sources..channels = + +# set channel for sinks +.sinks..channel = +.sinks..channel = + +.sources..selector.type = replicating +---- + +The multiplexing select has a further set of properties to bifurcate the flow. +This requires specifying a mapping of an event attribute to a set for channel. +The selector checks for each configured attribute in the event header. If it +matches the specified value, then that event is sent to all the channels mapped +to that value. If there's no match, then the event is sent to set of channels +configured as default: + +[source,properties] +---- +# Mapping for multiplexing selector +.sources..selector.type = multiplexing +.sources..selector.header = +.sources..selector.mapping. = +.sources..selector.mapping. = +.sources..selector.mapping. = +#... + +.sources..selector.default = +---- + +The mapping allows overlapping the channels for each value. + +The following example has a single flow that multiplexed to two paths. The +agent named agent++_++foo has a single avro source and two channels linked to two sinks: + +[source,properties] +---- +# list the sources, sinks and channels in the agent +agent_foo.sources = avro-AppSrv-source1 +agent_foo.sinks = hdfs-Cluster1-sink1 avro-forward-sink2 +agent_foo.channels = mem-channel-1 file-channel-2 + +# set channels for source +agent_foo.sources.avro-AppSrv-source1.channels = mem-channel-1 file-channel-2 + +# set channel for sinks +agent_foo.sinks.hdfs-Cluster1-sink1.channel = mem-channel-1 +agent_foo.sinks.avro-forward-sink2.channel = file-channel-2 + +# channel selector configuration +agent_foo.sources.avro-AppSrv-source1.selector.type = multiplexing +agent_foo.sources.avro-AppSrv-source1.selector.header = State +agent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1 +agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2 +agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2 +agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1 +---- + +The selector checks for a header called "State". If the value is "CA" then its +sent to mem-channel-1, if its "AZ" then it goes to file-channel-2 or if its +"NY" then both. If the "State" header is not set or doesn't match any of the +three, then it goes to mem-channel-1 which is designated as 'default'. + +The selector also supports optional channels. To specify optional channels for +a header, the config parameter 'optional' is used in the following way: + +[source,properties] +---- +# channel selector configuration +agent_foo.sources.avro-AppSrv-source1.selector.type = multiplexing +agent_foo.sources.avro-AppSrv-source1.selector.header = State +agent_foo.sources.avro-AppSrv-source1.selector.mapping.CA = mem-channel-1 +agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2 +agent_foo.sources.avro-AppSrv-source1.selector.mapping.NY = mem-channel-1 file-channel-2 +agent_foo.sources.avro-AppSrv-source1.selector.optional.CA = mem-channel-1 file-channel-2 +agent_foo.sources.avro-AppSrv-source1.selector.mapping.AZ = file-channel-2 +agent_foo.sources.avro-AppSrv-source1.selector.default = mem-channel-1 +---- + +The selector will attempt to write to the required channels first and will fail +the transaction if even one of these channels fails to consume the events. The +transaction is reattempted on *all* of the channels. Once all required +channels have consumed the events, then the selector will attempt to write to +the optional channels. A failure by any of the optional channels to consume the +event is simply ignored and not retried. + +If there is an overlap between the optional channels and required channels for a +specific header, the channel is considered to be required, and a failure in the +channel will cause the entire set of required channels to be retried. For +instance, in the above example, for the header "CA" mem-channel-1 is considered +to be a required channel even though it is marked both as required and optional, +and a failure to write to this channel will cause that +event to be retried on *all* channels configured for the selector. + +Note that if a header does not have any required channels, then the event will +be written to the default channels and will be attempted to be written to the +optional channels for that header. Specifying optional channels will still cause +the event to be written to the default channels, if no required channels are +specified. If no channels are designated as default and there are no required, +the selector will attempt to write the events to the optional channels. Any +failures are simply ignored in that case. + +=== SSL/TLS support + +Several Flume components support the SSL/TLS protocols in order to communicate with other systems +securely. + +[cols=",",options="header",] +|=== +|Component |SSL server or client +|Avro Source |server +|Avro Sink |client +|Thrift Source |server +|Thrift Sink |client +|Kafka Source |client +|Kafka Channel |client +|Kafka Sink |client +|HTTP Source |server +|JMS Source |client +|Syslog TCP Source |server +|Multiport Syslog TCP Source |server +|=== + +The SSL compatible components have several configuration parameters to set up SSL, like +enable SSL flag, keystore / truststore parameters (location, password, type) and additional +SSL parameters (eg. disabled protocols). + +Enabling SSL for a component is always specified at component level in the agent configuration file. +So some components may be configured to use SSL while others not (even with the same component type). + +The keystore / truststore setup can be specified at component level or globally. + +In case of the component level setup, the keystore / truststore is configured in the agent +configuration file through component specific parameters. The advantage of this method is that the +components can use different keystores (if this would be needed). The disadvantage is that the +keystore parameters must be copied for each component in the agent configuration file. +The component level setup is optional, but if it is defined, it has higher precedence than +the global parameters. + +With the global setup, it is enough to define the keystore / truststore parameters once +and use the same settings for all components, which means less and more centralized configuration. + +The global setup can be configured either through system properties or through environment variables. + +[cols=",,",options="header",] +|=== +|System property |Environment variable |Description +|javax.net.ssl.keyStore |FLUME++_++SSL++_++KEYSTORE++_++PATH |Keystore location +|javax.net.ssl.keyStorePassword |FLUME++_++SSL++_++KEYSTORE++_++PASSWORD |Keystore password +|javax.net.ssl.keyStoreType |FLUME++_++SSL++_++KEYSTORE++_++TYPE |Keystore type (by default JKS) +|javax.net.ssl.trustStore |FLUME++_++SSL++_++TRUSTSTORE++_++PATH |Truststore location +|javax.net.ssl.trustStorePassword |FLUME++_++SSL++_++TRUSTSTORE++_++PASSWORD |Truststore password +|javax.net.ssl.trustStoreType |FLUME++_++SSL++_++TRUSTSTORE++_++TYPE |Truststore type (by default JKS) +|flume.ssl.include.protocols |FLUME++_++SSL++_++INCLUDE++_++PROTOCOLS |Protocols to include when calculating enabled protocols. A comma (,) separated list. +Excluded protocols will be excluded from this list if provided. +|flume.ssl.exclude.protocols |FLUME++_++SSL++_++EXCLUDE++_++PROTOCOLS |Protocols to exclude when calculating enabled protocols. A comma (,) separated list. +|flume.ssl.include.cipherSuites |FLUME++_++SSL++_++INCLUDE++_++CIPHERSUITES |Cipher suites to include when calculating enabled cipher suites. A comma (,) separated list. +Excluded cipher suites will be excluded from this list if provided. +|flume.ssl.exclude.cipherSuites |FLUME++_++SSL++_++EXCLUDE++_++CIPHERSUITES |Cipher suites to exclude when calculating enabled cipher suites. A comma (,) separated list. +|=== + +The SSL system properties can either be passed on the command line or by setting the `JAVA++_++OPTS` +environment variable in _conf/flume-env.sh_. (Although, using the command line is inadvisable because +the commands including the passwords will be saved to the command history.) + +[source,properties] +---- +export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStore=/path/to/keystore.jks" +export JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStorePassword=password" +---- + +Flume uses the system properties defined in JSSE (Java Secure Socket Extension), so this is +a standard way for setting up SSL. On the other hand, specifying passwords in system properties +means that the passwords can be seen in the process list. For cases where it is not acceptable, +it is also be possible to define the parameters in environment variables. Flume initializes +the JSSE system properties from the corresponding environment variables internally in this case. + +The SSL environment variables can either be set in the shell environment before +starting Flume or in _conf/flume-env.sh_. (Although, using the command line is inadvisable because +the commands including the passwords will be saved to the command history.) + +[source,properties] +---- +export FLUME_SSL_KEYSTORE_PATH=/path/to/keystore.jks +export FLUME_SSL_KEYSTORE_PASSWORD=password +---- + +*Please note:* + +* SSL must be enabled at component level. Specifying the global SSL parameters alone will not +have any effect. +* If the global SSL parameters are specified at multiple levels, the priority is the +following (from higher to lower): +** component parameters in agent config +** system properties +** environment variables +* If SSL is enabled for a component, but the SSL parameters are not specified in any of the ways +described above, then +** in case of keystores: configuration error +** in case of truststores: the default truststore will be used (`jssecacerts` / `cacerts` in Oracle JDK) +* The trustore password is optional in all cases. If not specified, then no integrity check will be +performed on the truststore when it is opened by the JDK. + +=== Source and sink batch sizes and channel transaction capacities + +Sources and sinks can have a batch size parameter that determines the maximum number of events they +process in one batch. This happens within a channel transaction that has an upper limit called +transaction capacity. Batch size must be smaller than the channel's transaction capacity. +There is an explicit check to prevent incompatible settings. This check happens +whenever the configuration is read. + +=== Flume Sources + +==== Avro Source + +Listens on Avro port and receives events from external Avro client streams. +When paired with the built-in Avro Sink on another (previous hop) Flume agent, +it can create tiered collection topologies. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `avro` +|*bind* |-- |hostname or IP address to listen on +|*port* |-- |Port ++#++ to bind to +|threads |-- |Maximum number of worker threads to spawn +|selector.type | | +|selector.++*++ | | +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|compression-type |none |This can be "none" or "deflate". The compression-type must match the compression-type of matching AvroSource +|ssl |false |Set this to true to enable SSL encryption. If SSL is enabled, +you must also specify a "keystore" and a "keystore-password", +either through component level parameters (see below) +or as global SSL parameters (see link:#ssltls-support[SSL/TLS support] section). +|keystore |-- |This is the path to a Java keystore file. +If not specified here, then the global keystore will be used +(if defined, otherwise configuration error). +|keystore-password |-- |The password for the Java keystore. +If not specified here, then the global keystore password will be used +(if defined, otherwise configuration error). +|keystore-type |JKS |The type of the Java keystore. This can be "JKS" or "PKCS12". +If not specified here, then the global keystore type will be used +(if defined, otherwise the default is JKS). +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude. +SSLv3 will always be excluded in addition to the protocols specified. +|include-protocols |-- |Space-separated list of SSL/TLS protocols to include. +The enabled protocols will be the included protocols without the excluded protocols. +If included-protocols is empty, it includes every supported protocols. +|exclude-cipher-suites |-- |Space-separated list of cipher suites to exclude. +|include-cipher-suites |-- |Space-separated list of cipher suites to include. +The enabled cipher suites will be the included cipher suites without the excluded cipher suites. +If included-cipher-suites is empty, it includes every supported cipher suites. +|ipFilter |false |Set this to true to enable ipFiltering for netty +|ipFilterRules |-- |Define N netty ipFilter pattern rules with this config. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = avro +a1.sources.r1.channels = c1 +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = 4141 +---- + +Example of ipFilterRules + +ipFilterRules defines N netty ipFilters separated by a comma a pattern rule must be in this format. + +++<++'allow' or deny++>++:++<++'ip' or 'name' for computer name++>++:++<++pattern++>++ +or +allow/deny:ip/name:pattern + +example: ipFilterRules=allow:ip:127.++*++,allow:name:localhost,deny:ip:++*++ + +Note that the first rule to match will apply as the example below shows from a client on the localhost + +This will Allow the client on localhost be deny clients from any other ip "allow:name:localhost,deny:ip:++*++" +This will deny the client on localhost be allow clients from any other ip "deny:name:localhost,allow:ip:++*++" + +==== Thrift Source + +Listens on Thrift port and receives events from external Thrift client streams. +When paired with the built-in ThriftSink on another (previous hop) Flume agent, +it can create tiered collection topologies. +Thrift source can be configured to start in secure mode by enabling kerberos authentication. +agent-principal and agent-keytab are the properties used by the +Thrift source to authenticate to the kerberos KDC. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `thrift` +|*bind* |-- |hostname or IP address to listen on +|*port* |-- |Port ++#++ to bind to +|threads |-- |Maximum number of worker threads to spawn +|selector.type | | +|selector.++*++ | | +|interceptors |-- |Space separated list of interceptors +|interceptors.++*++ | | +|ssl |false |Set this to true to enable SSL encryption. If SSL is enabled, +you must also specify a "keystore" and a "keystore-password", +either through component level parameters (see below) +or as global SSL parameters (see link:#ssltls-support[SSL/TLS support] section) +|keystore |-- |This is the path to a Java keystore file. +If not specified here, then the global keystore will be used +(if defined, otherwise configuration error). +|keystore-password |-- |The password for the Java keystore. +If not specified here, then the global keystore password will be used +(if defined, otherwise configuration error). +|keystore-type |JKS |The type of the Java keystore. This can be "JKS" or "PKCS12". +If not specified here, then the global keystore type will be used +(if defined, otherwise the default is JKS). +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude. +SSLv3 will always be excluded in addition to the protocols specified. +|include-protocols |-- |Space-separated list of SSL/TLS protocols to include. +The enabled protocols will be the included protocols without the excluded protocols. +If included-protocols is empty, it includes every supported protocols. +|exclude-cipher-suites |-- |Space-separated list of cipher suites to exclude. +|include-cipher-suites |-- |Space-separated list of cipher suites to include. +The enabled cipher suites will be the included cipher suites without the excluded cipher suites. +|kerberos |false |Set to true to enable kerberos authentication. In kerberos mode, agent-principal and agent-keytab are required for successful authentication. The Thrift source in secure mode, will accept connections only from Thrift clients that have kerberos enabled and are successfully authenticated to the kerberos KDC. +|agent-principal |-- |The kerberos principal used by the Thrift Source to authenticate to the kerberos KDC. +|agent-keytab |—- |The keytab location used by the Thrift Source in combination with the agent-principal to authenticate to the kerberos KDC. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = thrift +a1.sources.r1.channels = c1 +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = 4141 +---- + +==== Exec Source + +Exec source runs a given Unix command on start-up and expects that process to +continuously produce data on standard out (stderr is simply discarded, unless +property logStdErr is set to true). If the process exits for any reason, the source also exits and +will produce no further data. This means configurations such as `cat ++[++named pipe++]++` +or `tail -F ++[++file++]++` are going to produce the desired results where as `date` +will probably not - the former two commands produce streams of data where as the +latter produces a single event and exits. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `exec` +|*command* |-- |The command to execute +|shell |-- |A shell invocation used to run the command. e.g. /bin/sh -c. Required only for commands relying on shell features like wildcards, back ticks, pipes etc. +|restartThrottle |10000 |Amount of time (in millis) to wait before attempting a restart +|restart |false |Whether the executed cmd should be restarted if it dies +|logStdErr |false |Whether the command's stderr should be logged +|batchSize |20 |The max number of lines to read and send to the channel at a time +|batchTimeout |3000 |Amount of time (in milliseconds) to wait, if the buffer size was not reached, before data is pushed downstream +|selector.type |replicating |replicating or multiplexing +|selector.++*++ | |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +[WARNING] +==== +The problem with ExecSource and other asynchronous sources is that the +source can not guarantee that if there is a failure to put the event +into the Channel the client knows about it. In such cases, the data will +be lost. As a for instance, one of the most commonly requested features +is the `tail -F ++[++file++]++`-like use case where an application writes +to a log file on disk and Flume tails the file, sending each line as an +event. While this is possible, there's an obvious problem; what happens +if the channel fills up and Flume can't send an event? Flume has no way +of indicating to the application writing the log file that it needs to +retain the log or that the event hasn't been sent, for some reason. If +this doesn't make sense, you need only know this: Your application can +never guarantee data has been received when using a unidirectional +asynchronous interface such as ExecSource! As an extension of this +warning - and to be completely clear - there is absolutely zero guarantee +of event delivery when using this source. For stronger reliability +guarantees, consider the Spooling Directory Source, Taildir Source or direct integration +with Flume via the SDK. +==== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = exec +a1.sources.r1.command = tail -F /var/log/secure +a1.sources.r1.channels = c1 +---- + +The 'shell' config is used to invoke the 'command' through a command shell (such as Bash +or Powershell). The 'command' is passed as an argument to 'shell' for execution. This +allows the 'command' to use features from the shell such as wildcards, back ticks, pipes, +loops, conditionals etc. In the absence of the 'shell' config, the 'command' will be +invoked directly. Common values for 'shell' : '/bin/sh -c', '/bin/ksh -c', +'cmd /c', 'powershell -Command', etc. + +[source,properties] +---- +a1.sources.tailsource-1.type = exec +a1.sources.tailsource-1.shell = /bin/bash -c +a1.sources.tailsource-1.command = for i in /path/*.txt; do cat $i; done +---- + +==== JMS Source + +JMS Source reads messages from a JMS destination such as a queue or topic. Being a JMS +application it should work with any JMS provider but has only been tested with ActiveMQ. +The JMS source provides configurable batch size, message selector, user/pass, and message +to flume event converter. Note that the vendor provided JMS jars should be included in the +Flume classpath using plugins.d directory (preferred), --classpath on command line, or +via FLUME++_++CLASSPATH variable in flume-env.sh. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `jms` +|*initialContextFactory* |-- |Inital Context Factory, e.g: org.apache.activemq.jndi.ActiveMQInitialContextFactory +|*connectionFactory* |-- |The JNDI name the connection factory should appear as +|*providerURL* |-- |The JMS provider URL +|*destinationName* |-- |Destination name +|*destinationType* |-- |Destination type (queue or topic) +|messageSelector |-- |Message selector to use when creating the consumer +|userName |-- |Username for the destination/provider +|passwordFile |-- |File containing the password for the destination/provider +|batchSize |100 |Number of messages to consume in one batch +|converter.type |DEFAULT |Class to use to convert messages to flume events. See below. +|converter.++*++ |-- |Converter properties. +|converter.charset |UTF-8 |Default converter only. Charset to use when converting JMS TextMessages to byte arrays. +|createDurableSubscription |false |Whether to create durable subscription. Durable subscription can only be used with +destinationType topic. If true, "clientId" and "durableSubscriptionName" +have to be specified. +|clientId |-- |JMS client identifier set on Connection right after it is created. +Required for durable subscriptions. +|durableSubscriptionName |-- |Name used to identify the durable subscription. Required for durable subscriptions. +|=== + +===== JMS message converter + +The JMS source allows pluggable converters, though it's likely the default converter will work +for most purposes. The default converter is able to convert Bytes, Text, and Object messages +to FlumeEvents. In all cases, the properties in the message are added as headers to the +FlumeEvent. + +BytesMessage::: + Bytes of message are copied to body of the FlumeEvent. Cannot convert more than 2GB + of data per message. +TextMessage::: + Text of message is converted to a byte array and copied to the body of the + FlumeEvent. The default converter uses UTF-8 by default but this is configurable. +ObjectMessage::: + Object is written out to a ByteArrayOutputStream wrapped in an ObjectOutputStream and + the resulting array is copied to the body of the FlumeEvent. + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = jms +a1.sources.r1.channels = c1 +a1.sources.r1.initialContextFactory = org.apache.activemq.jndi.ActiveMQInitialContextFactory +a1.sources.r1.connectionFactory = GenericConnectionFactory +a1.sources.r1.providerURL = tcp://mqserver:61616 +a1.sources.r1.destinationName = BUSINESS_DATA +a1.sources.r1.destinationType = QUEUE +---- + +===== SSL and JMS Source + +JMS client implementations typically support to configure SSL/TLS via some Java system properties defined by JSSE +(Java Secure Socket Extension). Specifying these system properties for Flume's JVM, JMS Source (or more precisely the +JMS client implementation used by the JMS Source) can connect to the JMS server through SSL (of course only when the JMS +server has also been set up to use SSL). +It should work with any JMS provider and has been tested with ActiveMQ, IBM MQ and Oracle WebLogic. + +The following sections describe the SSL configuration steps needed on the Flume side only. You can find more detailed +descriptions about the server side setup of the different JMS providers and also full working configuration examples on +Flume Wiki. + +*SSL transport / server authentication:* + +If the JMS server uses self-signed certificate or its certificate is signed by a non-trusted CA (eg. the company's own +CA), then a truststore (containing the right certificate) needs to be set up and passed to Flume. It can be done via +the global SSL parameters. For more details about the global SSL setup, see the link:#ssltls-support[SSL/TLS support] section. + +Some JMS providers require SSL specific JNDI Initial Context Factory and/or Provider URL settings when using SSL (eg. +ActiveMQ uses ssl:// URL prefix instead of tcp://). +In this case the source properties (`initialContextFactory` and/or `providerURL`) have to be adjusted in the agent +config file. + +*Client certificate authentication (two-way SSL):* + +JMS Source can authenticate to the JMS server through client certificate authentication instead of the usual +user/password login (when SSL is used and the JMS server is configured to accept this kind of authentication). + +The keystore containing Flume's key used for the authentication needs to be configured via the global SSL parameters +again. For more details about the global SSL setup, see the link:#ssltls-support[SSL/TLS support] section. + +The keystore should contain only one key (if multiple keys are present, then the first one will be used). +The key password must be the same as the keystore password. + +In case of client certificate authentication, it is not needed to specify the `userName` / `passwordFile` properties +for the JMS Source in the Flume agent config file. + +*Please note:* + +There are no component level configuration parameters for JMS Source unlike in case of other components. +No enable SSL flag either. +SSL setup is controlled by JNDI/Provider URL settings (ultimately the JMS server settings) and by the presence / absence +of the truststore / keystore. + +==== Spooling Directory Source + +This source lets you ingest data by placing files to be ingested into a +"spooling" directory on disk. +This source will watch the specified directory for new files, and will parse +events out of new files as they appear. +The event parsing logic is pluggable. +After a given file has been fully read +into the channel, completion by default is indicated by renaming the file or it can be deleted or the trackerDir is used +to keep track of processed files. + +Unlike the Exec source, this source is reliable and will not miss data, even if +Flume is restarted or killed. In exchange for this reliability, only immutable, +uniquely-named files must be dropped into the spooling directory. Flume tries +to detect these problem conditions and will fail loudly if they are violated: + +. If a file is written to after being placed into the spooling directory, +Flume will print an error to its log file and stop processing. +. If a file name is reused at a later time, Flume will print an error to its +log file and stop processing. + +To avoid the above issues, it may be useful to add a unique identifier +(such as a timestamp) to log file names when they are moved into the spooling +directory. + +Despite the reliability guarantees of this source, there are still +cases in which events may be duplicated if certain downstream failures occur. +This is consistent with the guarantees offered by other Flume components. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `spooldir`. +|*spoolDir* |-- |The directory from which to read files from. +|fileSuffix |.COMPLETED |Suffix to append to completely ingested files +|deletePolicy |never |When to delete completed files: `never` or `immediate` +|fileHeader |false |Whether to add a header storing the absolute path filename. +|fileHeaderKey |file |Header key to use when appending absolute path filename to event header. +|basenameHeader |false |Whether to add a header storing the basename of the file. +|basenameHeaderKey |basename |Header Key to use when appending basename of file to event header. +|includePattern |^.++*++$ |Regular expression specifying which files to include. +It can used together with `ignorePattern`. +If a file matches both `ignorePattern` and `includePattern` regex, +the file is ignored. +|ignorePattern |^$ |Regular expression specifying which files to ignore (skip). +It can used together with `includePattern`. +If a file matches both `ignorePattern` and `includePattern` regex, +the file is ignored. +|trackerDir |.flumespool |Directory to store metadata related to processing of files. +If this path is not an absolute path, then it is interpreted as relative to the spoolDir. +|trackingPolicy |rename |The tracking policy defines how file processing is tracked. It can be "rename" or +"tracker++_++dir". This parameter is only effective if the deletePolicy is "never". +"rename" - After processing files they get renamed according to the fileSuffix parameter. +"tracker++_++dir" - Files are not renamed but a new empty file is created in the trackerDir. +The new tracker file name is derived from the ingested one plus the fileSuffix. +|consumeOrder |oldest |In which order files in the spooling directory will be consumed `oldest`, +`youngest` and `random`. In case of `oldest` and `youngest`, the last modified +time of the files will be used to compare the files. In case of a tie, the file +with smallest lexicographical order will be consumed first. In case of `random` any +file will be picked randomly. When using `oldest` and `youngest` the whole +directory will be scanned to pick the oldest/youngest file, which might be slow if there +are a large number of files, while using `random` may cause old files to be consumed +very late if new files keep coming in the spooling directory. +|pollDelay |500 |Delay (in milliseconds) used when polling for new files. +|recursiveDirectorySearch |false |Whether to monitor sub directories for new files to read. +|maxBackoff |4000 |The maximum time (in millis) to wait between consecutive attempts to +write to the channel(s) if the channel is full. The source will start at +a low backoff and increase it exponentially each time the channel throws a +ChannelException, up to the value specified by this parameter. +|batchSize |100 |Granularity at which to batch transfer to the channel +|inputCharset |UTF-8 |Character set used by deserializers that treat the input file as text. +|decodeErrorPolicy |`FAIL` |What to do when we see a non-decodable character in the input file. +`FAIL`: Throw an exception and fail to parse the file. +`REPLACE`: Replace the unparseable character with the "replacement character" char, +typically Unicode U{plus}FFFD. +`IGNORE`: Drop the unparseable character sequence. +|deserializer |`LINE` |Specify the deserializer used to parse the file into events. +Defaults to parsing each line as an event. The class specified must implement +`EventDeserializer.Builder`. +|deserializer.++*++ | |Varies per event deserializer. +|bufferMaxLines |-- |(Obsolete) This option is now ignored. +|bufferMaxLineLength |5000 |(Deprecated) Maximum length of a line in the commit buffer. Use deserializer.maxLineLength instead. +|selector.type |replicating |replicating or multiplexing +|selector.++*++ | |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +Example for an agent named agent-1: + +[source,properties] +---- +a1.channels = ch-1 +a1.sources = src-1 + +a1.sources.src-1.type = spooldir +a1.sources.src-1.channels = ch-1 +a1.sources.src-1.spoolDir = /var/log/apache/flumeSpool +a1.sources.src-1.fileHeader = true +---- + +===== Event Deserializers + +The following event deserializers ship with Flume. + +====== LINE + +This deserializer generates one event per line of text input. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|deserializer.maxLineLength |2048 |Maximum number of characters to include in a single event. +If a line exceeds this length, it is truncated, and the +remaining characters on the line will appear in a +subsequent event. +|deserializer.outputCharset |UTF-8 |Charset to use for encoding events put into the channel. +|=== + +====== AVRO + +This deserializer is able to read an Avro container file, and it generates +one event per Avro record in the file. +Each event is annotated with a header that indicates the schema used. +The body of the event is the binary Avro record data, not +including the schema or the rest of the container file elements. + +Note that if the spool directory source must retry putting one of these events +onto a channel (for example, because the channel is full), then it will reset +and retry from the most recent Avro container file sync point. To reduce +potential event duplication in such a failure scenario, write sync markers more +frequently in your Avro input files. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|deserializer.schemaType |HASH |How the schema is represented. By default, or when the value `HASH` +is specified, the Avro schema is hashed and +the hash is stored in every event in the event header +"flume.avro.schema.hash". If `LITERAL` is specified, the JSON-encoded +schema itself is stored in every event in the event header +"flume.avro.schema.literal". Using `LITERAL` mode is relatively +inefficient compared to `HASH` mode. +|=== + +====== BlobDeserializer + +This deserializer reads a Binary Large Object (BLOB) per event, typically one BLOB per file. For example a PDF or JPG file. Note that this approach is not suitable for very large objects because the entire BLOB is buffered in RAM. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*deserializer* |-- |The FQCN of this class: `org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder` +|deserializer.maxBlobLength |100000000 |The maximum number of bytes to read and buffer for a given request +|=== + +==== Taildir Source + +[NOTE] +==== +*This source is provided as a preview feature. It does not work on Windows.* +==== + +Watch the specified files, and tail them in nearly real-time once detected new lines appended to the each files. +If the new lines are being written, this source will retry reading them in wait for the completion of the write. + +This source is reliable and will not miss data even when the tailing files rotate. +It periodically writes the last read position of each files on the given position file in JSON format. +If Flume is stopped or down for some reason, it can restart tailing from the position written on the existing position file. + +In other use case, this source can also start tailing from the arbitrary position for each files using the given position file. +When there is no position file on the specified path, it will start tailing from the first line of each files by default. + +Files will be consumed in order of their modification time. File with the oldest modification time will be consumed first. + +This source does not rename or delete or do any modifications to the file being tailed. +Currently this source does not support tailing binary files. It reads text files line by line. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `TAILDIR`. +|*filegroups* |-- |Space-separated list of file groups. Each file group indicates a set of files to be tailed. +|*filegroups.++<++filegroupName++>++* |-- |Absolute path of the file group. Regular expression (and not file system patterns) can be used for filename only. +|positionFile |~/.flume/taildir++_++position.json |File in JSON format to record the inode, the absolute path and the last position of each tailing file. +|headers.++<++filegroupName++>++.++<++headerKey++>++ |-- |Header value which is the set with header key. Multiple headers can be specified for one file group. +|byteOffsetHeader |false |Whether to add the byte offset of a tailed line to a header called 'byteoffset'. +|skipToEnd |false |Whether to skip the position to EOF in the case of files not written on the position file. +|idleTimeout |120000 |Time (ms) to close inactive files. If the closed file is appended new lines to, this source will automatically re-open it. +|writePosInterval |3000 |Interval time (ms) to write the last position of each file on the position file. +|batchSize |100 |Max number of lines to read and send to the channel at a time. Using the default is usually fine. +|maxBatchCount |Long.MAX++_++VALUE |Controls the number of batches being read consecutively from the same file. +If the source is tailing multiple files and one of them is written at a fast rate, +it can prevent other files to be processed, because the busy file would be read in an endless loop. +In this case lower this value. +|backoffSleepIncrement |1000 |The increment for time delay before reattempting to poll for new data, when the last attempt did not find any new data. +|maxBackoffSleep |5000 |The max time delay between each reattempt to poll for new data, when the last attempt did not find any new data. +|cachePatternMatching |true |Listing directories and applying the filename regex pattern may be time consuming for directories +containing thousands of files. Caching the list of matching files can improve performance. +The order in which files are consumed will also be cached. +Requires that the file system keeps track of modification times with at least a 1-second granularity. +|fileHeader |false |Whether to add a header storing the absolute path filename. +|fileHeaderKey |file |Header key to use when appending absolute path filename to event header. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = TAILDIR +a1.sources.r1.channels = c1 +a1.sources.r1.positionFile = /var/log/flume/taildir_position.json +a1.sources.r1.filegroups = f1 f2 +a1.sources.r1.filegroups.f1 = /var/log/test1/example.log +a1.sources.r1.headers.f1.headerKey1 = value1 +a1.sources.r1.filegroups.f2 = /var/log/test2/.*log.* +a1.sources.r1.headers.f2.headerKey1 = value2 +a1.sources.r1.headers.f2.headerKey2 = value2-2 +a1.sources.r1.fileHeader = true +a1.sources.ri.maxBatchCount = 1000 +---- + +==== Twitter 1% firehose Source (experimental) + +[WARNING] +==== +This source is highly experimental and may change between minor versions of Flume. +Use at your own risk. +==== + +Experimental source that connects via Streaming API to the 1% sample twitter +firehose, continuously downloads tweets, converts them to Avro format and +sends Avro events to a downstream Flume sink. Requires the consumer and +access tokens and secrets of a Twitter developer account. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `org.apache.flume.source.twitter.TwitterSource` +|*consumerKey* |-- |OAuth consumer key +|*consumerSecret* |-- |OAuth consumer secret +|*accessToken* |-- |OAuth access token +|*accessTokenSecret* |-- |OAuth token secret +|maxBatchSize |1000 |Maximum number of twitter messages to put in a single batch +|maxBatchDurationMillis |1000 |Maximum number of milliseconds to wait before closing a batch +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = org.apache.flume.source.twitter.TwitterSource +a1.sources.r1.channels = c1 +a1.sources.r1.consumerKey = YOUR_TWITTER_CONSUMER_KEY +a1.sources.r1.consumerSecret = YOUR_TWITTER_CONSUMER_SECRET +a1.sources.r1.accessToken = YOUR_TWITTER_ACCESS_TOKEN +a1.sources.r1.accessTokenSecret = YOUR_TWITTER_ACCESS_TOKEN_SECRET +a1.sources.r1.maxBatchSize = 10 +a1.sources.r1.maxBatchDurationMillis = 200 +---- + +==== Kafka Source + +Kafka Source is an Apache Kafka consumer that reads messages from Kafka topics. +If you have multiple Kafka sources running, you can configure them with the same Consumer Group +so each will read a unique set of partitions for the topics. This currently supports Kafka server releases 0.10.1.0 or higher. Testing was done up to 2.0.1 that was the highest avilable version at the time of the release. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `org.apache.flume.source.kafka.KafkaSource` +|*kafka.bootstrap.servers* |-- |List of brokers in the Kafka cluster used by the source +|kafka.consumer.group.id |flume |Unique identified of consumer group. Setting the same id in multiple sources or agents +indicates that they are part of the same consumer group +|*kafka.topics* |-- |Comma-separated list of topics the Kafka consumer will read messages from. +|*kafka.topics.regex* |-- |Regex that defines set of topics the source is subscribed on. This property has higher priority +than `kafka.topics` and overrides `kafka.topics` if exists. +|batchSize |1000 |Maximum number of messages written to Channel in one batch +|batchDurationMillis |1000 |Maximum time (in ms) before a batch will be written to Channel +The batch will be written whenever the first of size and time will be reached. +|backoffSleepIncrement |1000 |Initial and incremental wait time that is triggered when a Kafka Topic appears to be empty. +Wait period will reduce aggressive pinging of an empty Kafka Topic. One second is ideal for +ingestion use cases but a lower value may be required for low latency operations with +interceptors. +|maxBackoffSleep |5000 |Maximum wait time that is triggered when a Kafka Topic appears to be empty. Five seconds is +ideal for ingestion use cases but a lower value may be required for low latency operations +with interceptors. +|useFlumeEventFormat |false |By default events are taken as bytes from the Kafka topic directly into the event body. Set to +true to read events as the Flume Avro binary format. Used in conjunction with the same property +on the KafkaSink or with the parseAsFlumeEvent property on the Kafka Channel this will preserve +any Flume headers sent on the producing side. +|setTopicHeader |true |When set to true, stores the topic of the retrieved message into a header, defined by the +`topicHeader` property. +|topicHeader |topic |Defines the name of the header in which to store the name of the topic the message was received +from, if the `setTopicHeader` property is set to `true`. Care should be taken if combining +with the Kafka Sink `topicHeader` property so as to avoid sending the message back to the same +topic in a loop. +|timestampHeader |-- |If present the Kafka message timestamp value will be copied into the specified Flume header name. +|header.NAME |-- |Used to identify which headers from the Kafka message should be added as a FLume header. The value +of NAME should match the Flume header name and the value should be the name of the header to be used +as the Kafka header name. +|kafka.consumer.security.protocol |PLAINTEXT |Set to SASL++_++PLAINTEXT, SASL++_++SSL or SSL if writing to Kafka using some level of security. See below for additional info on secure setup. +|_more consumer security props_ | |If using SASL++_++PLAINTEXT, SASL++_++SSL or SSL refer to https://kafka.apache.org/documentation.html#security[Kafka security] for additional +properties that need to be set on consumer. +|Other Kafka Consumer Properties |-- |These properties are used to configure the Kafka Consumer. Any consumer property supported +by Kafka can be used. The only requirement is to prepend the property name with the prefix +`kafka.consumer`. +For example: `kafka.consumer.auto.offset.reset` +|=== + +[NOTE] +==== +The Kafka Source overrides two Kafka consumer parameters: +auto.commit.enable is set to "false" by the source and every batch is committed. Kafka source guarantees at least once +strategy of messages retrieval. The duplicates can be present when the source starts. +The Kafka Source also provides defaults for the key.deserializer(org.apache.kafka.common.serialization.StringSerializer) +and value.deserializer(org.apache.kafka.common.serialization.ByteArraySerializer). Modification of these parameters is not recommended. +==== + +Deprecated Properties + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|topic |-- |Use kafka.topics +|groupId |flume |Use kafka.consumer.group.id +|zookeeperConnect |-- |Is no longer supported by Kafka consumer client since 0.9.x. Use kafka.bootstrap.servers +to establish connection with Kafka cluster +|migrateZookeeperOffsets |true |When no Kafka stored offset is found, look up the offsets in Zookeeper and commit them to Kafka. +This should be true to support seamless Kafka client migration from older versions of Flume. +Once migrated this can be set to false, though that should generally not be required. +If no Zookeeper offset is found, the Kafka configuration kafka.consumer.auto.offset.reset +defines how offsets are handled. +Check https://kafka.apache.org/documentation.html#consumerconfigs[Kafka documentation] +for details +|=== + +Example for topic subscription by comma-separated topic list. + +[source,properties] +---- +tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource +tier1.sources.source1.channels = channel1 +tier1.sources.source1.batchSize = 5000 +tier1.sources.source1.batchDurationMillis = 2000 +tier1.sources.source1.kafka.bootstrap.servers = localhost:9092 +tier1.sources.source1.kafka.topics = test1, test2 +tier1.sources.source1.kafka.consumer.group.id = custom.g.id +---- + +Example for topic subscription by regex + +[source,properties] +---- +tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource +tier1.sources.source1.channels = channel1 +tier1.sources.source1.kafka.bootstrap.servers = localhost:9092 +tier1.sources.source1.kafka.topics.regex = ^topic[0-9]$ +# the default kafka.consumer.group.id=flume is used +---- + +*Security and Kafka Source:* + +Secure authentication as well as data encryption is supported on the communication channel between Flume and Kafka. +For secure authentication SASL/GSSAPI (Kerberos V5) or SSL (even though the parameter is named SSL, the actual protocol is a TLS implementation) can be used from Kafka version 0.9.0. + +As of now data encryption is solely provided by SSL/TLS. + +Setting `kafka.consumer.security.protocol` to any of the following value means: + +* *SASL++_++PLAINTEXT* - Kerberos or plaintext authentication with no data encryption +* *SASL++_++SSL* - Kerberos or plaintext authentication with data encryption +* *SSL* - TLS based encryption with optional authentication. + +[WARNING] +==== +There is a performance degradation when SSL is enabled, +the magnitude of which depends on the CPU type and the JVM implementation. +Reference: https://kafka.apache.org/documentation#security_overview[Kafka security overview] +and the jira for tracking this issue: +https://issues.apache.org/jira/browse/KAFKA-2561[KAFKA-2561] +==== + +*TLS and Kafka Source:* + +Please read the steps described in https://kafka.apache.org/documentation#security_configclients[Configuring Kafka Clients SSL] +to learn about additional configuration settings for fine tuning for example any of the following: +security provider, cipher suites, enabled protocols, truststore or keystore types. + +Example configuration with server side authentication and data encryption. + +[source,properties] +---- +a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource +a1.sources.source1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.sources.source1.kafka.topics = mytopic +a1.sources.source1.kafka.consumer.group.id = flume-consumer +a1.sources.source1.kafka.consumer.security.protocol = SSL +# optional, the global truststore can be used alternatively +a1.sources.source1.kafka.consumer.ssl.truststore.location=/path/to/truststore.jks +a1.sources.source1.kafka.consumer.ssl.truststore.password= +---- + +Specifying the truststore is optional here, the global truststore can be used instead. +For more details about the global SSL setup, see the link:#ssltls-support[SSL/TLS support] section. + +Note: By default the property `ssl.endpoint.identification.algorithm` +is not defined, so hostname verification is not performed. +In order to enable hostname verification, set the following properties + +[source,properties] +---- +a1.sources.source1.kafka.consumer.ssl.endpoint.identification.algorithm=HTTPS +---- + +Once enabled, clients will verify the server's fully qualified domain name (FQDN) +against one of the following two fields: + +. Common Name (CN) https://tools.ietf.org/html/rfc6125#section-2.3 +. Subject Alternative Name (SAN) https://tools.ietf.org/html/rfc5280#section-4.2.1.6 + +If client side authentication is also required then additionally the following needs to be added to Flume agent +configuration or the global SSL setup can be used (see link:#ssltls-support[SSL/TLS support] section). +Each Flume agent has to have its client certificate which has to be trusted by Kafka brokers either +individually or by their signature chain. Common example is to sign each client certificate by a single Root CA +which in turn is trusted by Kafka brokers. + +[source,properties] +---- +# optional, the global keystore can be used alternatively +a1.sources.source1.kafka.consumer.ssl.keystore.location=/path/to/client.keystore.jks +a1.sources.source1.kafka.consumer.ssl.keystore.password= +---- + +If keystore and key use different password protection then `ssl.key.password` property will +provide the required additional secret for both consumer keystores: + +[source,properties] +---- +a1.sources.source1.kafka.consumer.ssl.key.password= +---- + +*Kerberos and Kafka Source:* + +To use Kafka source with a Kafka cluster secured with Kerberos, set the `consumer.security.protocol` properties noted above for consumer. +The Kerberos keytab and principal to be used with Kafka brokers is specified in a JAAS file's "KafkaClient" section. "Client" section describes the Zookeeper connection if needed. +See https://kafka.apache.org/documentation.html#security_sasl_clientconfig[Kafka doc] +for information on the JAAS file contents. The location of this JAAS file and optionally the system wide kerberos configuration can be specified via JAVA++_++OPTS in flume-env.sh: + +[source,properties] +---- +JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/path/to/krb5.conf" +JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=/path/to/flume_jaas.conf" +---- + +Example secure configuration using SASL++_++PLAINTEXT: + +[source,properties] +---- +a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource +a1.sources.source1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.sources.source1.kafka.topics = mytopic +a1.sources.source1.kafka.consumer.group.id = flume-consumer +a1.sources.source1.kafka.consumer.security.protocol = SASL_PLAINTEXT +a1.sources.source1.kafka.consumer.sasl.mechanism = GSSAPI +a1.sources.source1.kafka.consumer.sasl.kerberos.service.name = kafka +---- + +Example secure configuration using SASL++_++SSL: + +[source,properties] +---- +a1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource +a1.sources.source1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.sources.source1.kafka.topics = mytopic +a1.sources.source1.kafka.consumer.group.id = flume-consumer +a1.sources.source1.kafka.consumer.security.protocol = SASL_SSL +a1.sources.source1.kafka.consumer.sasl.mechanism = GSSAPI +a1.sources.source1.kafka.consumer.sasl.kerberos.service.name = kafka +# optional, the global truststore can be used alternatively +a1.sources.source1.kafka.consumer.ssl.truststore.location=/path/to/truststore.jks +a1.sources.source1.kafka.consumer.ssl.truststore.password= +---- + +Sample JAAS file. For reference of its content please see client config sections of the desired authentication mechanism (GSSAPI/PLAIN) +in Kafka documentation of https://kafka.apache.org/documentation#security_sasl_clientconfig[SASL configuration]. +Since the Kafka Source may also connect to Zookeeper for offset migration, the "Client" section was also added to this example. +This won't be needed unless you require offset migration, or you require this section for other secure components. +Also please make sure that the operating system user of the Flume processes has read privileges on the jaas and keytab files. + +[source,javascript] +---- +Client { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + keyTab="/path/to/keytabs/flume.keytab" + principal="flume/flumehost1.example.com@YOURKERBEROSREALM"; +}; + +KafkaClient { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + keyTab="/path/to/keytabs/flume.keytab" + principal="flume/flumehost1.example.com@YOURKERBEROSREALM"; +}; +---- + +==== NetCat TCP Source + +A netcat-like source that listens on a given port and turns each line of text +into an event. Acts like `nc -k -l ++[++host++]++ ++[++port++]++`. In other words, +it opens a specified port and listens for data. The expectation is that the +supplied data is newline separated text. Each line of text is turned into a +Flume event and sent via the connected channel. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `netcat` +|*bind* |-- |Host name or IP address to bind to +|*port* |-- |Port ++#++ to bind to +|max-line-length |512 |Max line length per event body (in bytes) +|ack-every-event |true |Respond with an "OK" for every event received +|selector.type |replicating |replicating or multiplexing +|selector.++*++ | |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = netcat +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = 6666 +a1.sources.r1.channels = c1 +---- + +==== NetCat UDP Source + +As per the original Netcat (TCP) source, this source that listens on a given +port and turns each line of text into an event and sent via the connected channel. +Acts like `nc -u -k -l ++[++host++]++ ++[++port++]++`. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `netcatudp` +|*bind* |-- |Host name or IP address to bind to +|*port* |-- |Port ++#++ to bind to +|remoteAddressHeader |-- | +|selector.type |replicating |replicating or multiplexing +|selector.++*++ | |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = netcatudp +a1.sources.r1.bind = 0.0.0.0 +a1.sources.r1.port = 6666 +a1.sources.r1.channels = c1 +---- + +==== Sequence Generator Source + +A simple sequence generator that continuously generates events with a counter that starts from 0, +increments by 1 and stops at totalEvents. Retries when it can't send events to the channel. Useful +mainly for testing. During retries it keeps the body of the retried messages the same as before so +that the number of unique events - after de-duplication at destination - is expected to be +equal to the specified `totalEvents`. Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `seq` +|selector.type | |replicating or multiplexing +|selector.++*++ |replicating |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|batchSize |1 |Number of events to attempt to process per request loop. +|totalEvents |Long.MAX++_++VALUE |Number of unique events sent by the source. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = seq +a1.sources.r1.channels = c1 +---- + +==== Syslog Sources + +Reads syslog data and generate Flume events. The UDP source treats an entire +message as a single event. The TCP sources create a new event for each string +of characters separated by a newline ('n'). + +Required properties are in *bold*. + +===== Syslog TCP Source + +The original, tried-and-true syslog TCP source. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `syslogtcp` +|*host* |-- |Host name or IP address to bind to +|*port* |-- |Port ++#++ to bind to +|eventSize |2500 |Maximum size of a single event line, in bytes +|keepFields |none |Setting this to 'all' will preserve the Priority, +Timestamp and Hostname in the body of the event. +A spaced separated list of fields to include +is allowed as well. Currently, the following +fields can be included: priority, version, +timestamp, hostname. The values 'true' and 'false' +have been deprecated in favor of 'all' and 'none'. +|clientIPHeader |-- |If specified, the IP address of the client will be stored in +the header of each event using the header name specified here. +This allows for interceptors and channel selectors to customize +routing logic based on the IP address of the client. +Do not use the standard Syslog header names here (like [#host]#host#++_++) +because the event header will be overridden in that case. +|clientHostnameHeader |-- |If specified, the host name of the client will be stored in +the header of each event using the header name specified here. +This allows for interceptors and channel selectors to customize +routing logic based on the host name of the client. +Retrieving the host name may involve a name service reverse +lookup which may affect the performance. +Do not use the standard Syslog header names here (like [#host]#host#++_++) +because the event header will be overridden in that case. +|selector.type | |replicating or multiplexing +|selector.++*++ |replicating |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|ssl |false |Set this to true to enable SSL encryption. If SSL is enabled, +you must also specify a "keystore" and a "keystore-password", +either through component level parameters (see below) +or as global SSL parameters (see link:#ssltls-support[SSL/TLS support] section). +|keystore |-- |This is the path to a Java keystore file. +If not specified here, then the global keystore will be used +(if defined, otherwise configuration error). +|keystore-password |-- |The password for the Java keystore. +If not specified here, then the global keystore password will be used +(if defined, otherwise configuration error). +|keystore-type |JKS |The type of the Java keystore. This can be "JKS" or "PKCS12". +If not specified here, then the global keystore type will be used +(if defined, otherwise the default is JKS). +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude. +SSLv3 will always be excluded in addition to the protocols specified. +|include-protocols |-- |Space-separated list of SSL/TLS protocols to include. +The enabled protocols will be the included protocols without the excluded protocols. +If included-protocols is empty, it includes every supported protocols. +|exclude-cipher-suites |-- |Space-separated list of cipher suites to exclude. +|include-cipher-suites |-- |Space-separated list of cipher suites to include. +The enabled cipher suites will be the included cipher suites without the excluded cipher suites. +If included-cipher-suites is empty, it includes every supported cipher suites. +|=== + +For example, a syslog TCP source for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = syslogtcp +a1.sources.r1.port = 5140 +a1.sources.r1.host = localhost +a1.sources.r1.channels = c1 +---- + +===== Multiport Syslog TCP Source + +This is a newer, faster, multi-port capable version of the Syslog TCP source. +Note that the `ports` configuration setting has replaced `port`. +Multi-port capability means that it can listen on many ports at once in an +efficient manner. This source uses the Apache Mina library to do that. +Provides support for RFC-3164 and many common RFC-5424 formatted messages. +Also provides the capability to configure the character set used on a per-port +basis. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `multiport++_++syslogtcp` +|*host* |-- |Host name or IP address to bind to. +|*ports* |-- |Space-separated list (one or more) of ports to bind to. +|eventSize |2500 |Maximum size of a single event line, in bytes. +|keepFields |none |Setting this to 'all' will preserve the +Priority, Timestamp and Hostname in the body of the event. +A spaced separated list of fields to include +is allowed as well. Currently, the following +fields can be included: priority, version, +timestamp, hostname. The values 'true' and 'false' +have been deprecated in favor of 'all' and 'none'. +|portHeader |-- |If specified, the port number will be stored in the header of each event using the header name specified here. This allows for interceptors and channel selectors to customize routing logic based on the incoming port. +|clientIPHeader |-- |If specified, the IP address of the client will be stored in +the header of each event using the header name specified here. +This allows for interceptors and channel selectors to customize +routing logic based on the IP address of the client. +Do not use the standard Syslog header names here (like [#host]#host#++_++) +because the event header will be overridden in that case. +|clientHostnameHeader |-- |If specified, the host name of the client will be stored in +the header of each event using the header name specified here. +This allows for interceptors and channel selectors to customize +routing logic based on the host name of the client. +Retrieving the host name may involve a name service reverse +lookup which may affect the performance. +Do not use the standard Syslog header names here (like [#host]#host#++_++) +because the event header will be overridden in that case. +|charset.default |UTF-8 |Default character set used while parsing syslog events into strings. +|charset.port.++<++port++>++ |-- |Character set is configurable on a per-port basis. +|batchSize |100 |Maximum number of events to attempt to process per request loop. Using the default is usually fine. +|readBufferSize |1024 |Size of the internal Mina read buffer. Provided for performance tuning. Using the default is usually fine. +|numProcessors |(auto-detected) |Number of processors available on the system for use while processing messages. Default is to auto-detect ++#++ of CPUs using the Java Runtime API. Mina will spawn 2 request-processing threads per detected CPU, which is often reasonable. +|selector.type |replicating |replicating, multiplexing, or custom +|selector.++*++ |-- |Depends on the `selector.type` value +|interceptors |-- |Space-separated list of interceptors. +|interceptors.++*++ | | +|ssl |false |Set this to true to enable SSL encryption. If SSL is enabled, +you must also specify a "keystore" and a "keystore-password", +either through component level parameters (see below) +or as global SSL parameters (see link:#ssltls-support[SSL/TLS support] section). +|keystore |-- |This is the path to a Java keystore file. +If not specified here, then the global keystore will be used +(if defined, otherwise configuration error). +|keystore-password |-- |The password for the Java keystore. +If not specified here, then the global keystore password will be used +(if defined, otherwise configuration error). +|keystore-type |JKS |The type of the Java keystore. This can be "JKS" or "PKCS12". +If not specified here, then the global keystore type will be used +(if defined, otherwise the default is JKS). +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude. +SSLv3 will always be excluded in addition to the protocols specified. +|include-protocols |-- |Space-separated list of SSL/TLS protocols to include. +The enabled protocols will be the included protocols without the excluded protocols. +If included-protocols is empty, it includes every supported protocols. +|exclude-cipher-suites |-- |Space-separated list of cipher suites to exclude. +|include-cipher-suites |-- |Space-separated list of cipher suites to include. +The enabled cipher suites will be the included cipher suites without the excluded cipher suites. +If included-cipher-suites is empty, it includes every supported cipher suites. +|=== + +For example, a multiport syslog TCP source for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = multiport_syslogtcp +a1.sources.r1.channels = c1 +a1.sources.r1.host = 0.0.0.0 +a1.sources.r1.ports = 10001 10002 10003 +a1.sources.r1.portHeader = port +---- + +===== Syslog UDP Source + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `syslogudp` +|*host* |-- |Host name or IP address to bind to +|*port* |-- |Port ++#++ to bind to +|keepFields |false |Setting this to true will preserve the Priority, +Timestamp and Hostname in the body of the event. +|clientIPHeader |-- |If specified, the IP address of the client will be stored in +the header of each event using the header name specified here. +This allows for interceptors and channel selectors to customize +routing logic based on the IP address of the client. +Do not use the standard Syslog header names here (like [#host]#host#++_++) +because the event header will be overridden in that case. +|clientHostnameHeader |-- |If specified, the host name of the client will be stored in +the header of each event using the header name specified here. +This allows for interceptors and channel selectors to customize +routing logic based on the host name of the client. +Retrieving the host name may involve a name service reverse +lookup which may affect the performance. +Do not use the standard Syslog header names here (like [#host]#host#++_++) +because the event header will be overridden in that case. +|selector.type | |replicating or multiplexing +|selector.++*++ |replicating |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +For example, a syslog UDP source for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = syslogudp +a1.sources.r1.port = 5140 +a1.sources.r1.host = localhost +a1.sources.r1.channels = c1 +---- + +==== HTTP Source + +A source which accepts Flume Events by HTTP POST and GET. GET should be used +for experimentation only. HTTP requests are converted into flume events by +a pluggable "handler" which must implement the HTTPSourceHandler interface. +This handler takes a HttpServletRequest and returns a list of +flume events. All events handled from one Http request are committed to the channel +in one transaction, thus allowing for increased efficiency on channels like +the file channel. If the handler throws an exception, this source will +return a HTTP status of 400. If the channel is full, or the source is unable to +append events to the channel, the source will return a HTTP 503 - Temporarily +unavailable status. + +All events sent in one post request are considered to be one batch and +inserted into the channel in one transaction. + +This source is based on Jetty 9.4 and offers the ability to set additional +Jetty-specific parameters which will be passed directly to the Jetty components. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* | |The component type name, needs to be `http` +|*port* |-- |The port the source should bind to. +|bind |0.0.0.0 |The hostname or IP address to listen on +|handler |`org.apache.flume.source.http.JSONHandler` |The FQCN of the handler class. +|handler.++*++ |-- |Config parameters for the handler +|selector.type |replicating |replicating or multiplexing +|selector.++*++ | |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|ssl |false |Set the property true, to enable SSL. _HTTP Source does not support SSLv3._ +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude. +SSLv3 will always be excluded in addition to the protocols specified. +|include-protocols |-- |Space-separated list of SSL/TLS protocols to include. +The enabled protocols will be the included protocols without the excluded protocols. +If included-protocols is empty, it includes every supported protocols. +|exclude-cipher-suites |-- |Space-separated list of cipher suites to exclude. +|include-cipher-suites |-- |Space-separated list of cipher suites to include. +The enabled cipher suites will be the included cipher suites without the excluded cipher suites. +|keystore | |Location of the keystore including keystore file name. +If SSL is enabled but the keystore is not specified here, +then the global keystore will be used +(if defined, otherwise configuration error). +|keystore-password | |Keystore password. +If SSL is enabled but the keystore password is not specified here, +then the global keystore password will be used +(if defined, otherwise configuration error). +|keystore-type |JKS |Keystore type. This can be "JKS" or "PKCS12". +|QueuedThreadPool.++*++ | |Jetty specific settings to be set on org.eclipse.jetty.util.thread.QueuedThreadPool. +N.B. QueuedThreadPool will only be used if at least one property of this class is set. +|HttpConfiguration.++*++ | |Jetty specific settings to be set on org.eclipse.jetty.server.HttpConfiguration +|SslContextFactory.++*++ | |Jetty specific settings to be set on org.eclipse.jetty.util.ssl.SslContextFactory (only +applicable when _ssl_ is set to true). +|ServerConnector.++*++ | |Jetty specific settings to be set on org.eclipse.jetty.server.ServerConnector +|=== + +Deprecated Properties + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|keystorePassword |-- |Use _keystore-password_. Deprecated value will be overwritten with the new one. +|excludeProtocols |SSLv3 |Use _exclude-protocols_. Deprecated value will be overwritten with the new one. +|enableSSL |false |Use _ssl_. Deprecated value will be overwritten with the new one. +|=== + +N.B. Jetty-specific settings are set using the setter-methods on the objects listed above. For full details see the Javadoc for these classes +(https://www.eclipse.org/jetty/javadoc/jetty-9/org/eclipse/jetty/util/thread/QueuedThreadPool.html[QueuedThreadPool], +https://www.eclipse.org/jetty/javadoc/jetty-9/org/eclipse/jetty/server/HttpConfiguration.html[HttpConfiguration], +https://www.eclipse.org/jetty/javadoc/jetty-9/org/eclipse/jetty/util/ssl/SslContextFactory.html[SslContextFactory] and +https://www.eclipse.org/jetty/javadoc/jetty-9/org/eclipse/jetty/server/ServerConnector.html[ServerConnector]). + +When using Jetty-specific setings, named properites above will take precedence (for example excludeProtocols will take +precedence over SslContextFactory.ExcludeProtocols). All properties will be inital lower case. + +An example http source for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = http +a1.sources.r1.port = 5140 +a1.sources.r1.channels = c1 +a1.sources.r1.handler = org.example.rest.RestHandler +a1.sources.r1.handler.nickname = random props +a1.sources.r1.HttpConfiguration.sendServerVersion = false +a1.sources.r1.ServerConnector.idleTimeout = 300 +---- + +===== JSONHandler + +A handler is provided out of the box which can handle events represented in +JSON format, and supports UTF-8, UTF-16 and UTF-32 character sets. The handler +accepts an array of events (even if there is only one event, the event has to be +sent in an array) and converts them to a Flume event based on the +encoding specified in the request. If no encoding is specified, UTF-8 is assumed. +The JSON handler supports UTF-8, UTF-16 and UTF-32. +Events are represented as follows. + +[source,javascript] +---- +[{ + "headers" : { + "timestamp" : "434324343", + "host" : "random_host.example.com" + }, + "body" : "random_body" + }, + { + "headers" : { + "namenode" : "namenode.example.com", + "datanode" : "random_datanode.example.com" + }, + "body" : "really_random_body" + }] +---- + +To set the charset, the request must have content type specified as +`application/json; charset=UTF-8` (replace UTF-8 with UTF-16 or UTF-32 as +required). + +One way to create an event in the format expected by this handler is to +use JSONEvent provided in the Flume SDK and use Google Gson to create the JSON +string using the Gson++#++fromJson(Object, Type) +method. The type token to pass as the 2nd argument of this method +for list of events can be created by: + +[source,java] +---- +Type type = new TypeToken>() {}.getType(); +---- + +===== BlobHandler + +By default HTTPSource splits JSON input into Flume events. As an alternative, BlobHandler is a handler for HTTPSource that returns an event that contains the request parameters as well as the Binary Large Object (BLOB) uploaded with this request. For example a PDF or JPG file. Note that this approach is not suitable for very large objects because it buffers up the entire BLOB in RAM. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*handler* |-- |The FQCN of this class: `org.apache.flume.sink.solr.morphline.BlobHandler` +|handler.maxBlobLength |100000000 |The maximum number of bytes to read and buffer for a given request +|=== + +==== Stress Source + +StressSource is an internal load-generating source implementation which is very useful for +stress tests. It allows User to configure the size of Event payload, with empty headers. +User can configure total number of events to be sent as well maximum number of Successful +Event to be delivered. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `org.apache.flume.source.StressSource` +|size |500 |Payload size of each Event. Unit:++**++byte++**++ +|maxTotalEvents a| +`-1`:: + +|Maximum number of Events to be sent +|maxSuccessfulEvents a| +`-1`:: + +|Maximum number of Events successfully sent +|batchSize |1 |Number of Events to be sent in one batch +|maxEventsPerSecond |0 |When set to an integer greater than zero, enforces a rate limiter onto the source. +|=== + +Example for agent named *a1*: + +[source,properties] +---- +a1.sources = stresssource-1 +a1.channels = memoryChannel-1 +a1.sources.stresssource-1.type = org.apache.flume.source.StressSource +a1.sources.stresssource-1.size = 10240 +a1.sources.stresssource-1.maxTotalEvents = 1000000 +a1.sources.stresssource-1.channels = memoryChannel-1 +---- + +==== Legacy Sources + +The legacy sources allow a Flume 1.x agent to receive events from Flume 0.9.4 +agents. It accepts events in the Flume 0.9.4 format, converts them to the Flume +1.0 format, and stores them in the connected channel. The 0.9.4 event +properties like timestamp, pri, host, nanos, etc get converted to 1.x event +header attributes. The legacy source supports both Avro and Thrift RPC +connections. To use this bridge between two Flume versions, you need to start a +Flume 1.x agent with the avroLegacy or thriftLegacy source. The 0.9.4 agent +should have the agent Sink pointing to the host/port of the 1.x agent. + +[NOTE] +==== +The reliability semantics of Flume 1.x are different from that of +Flume 0.9.x. The E2E or DFO mode of a Flume 0.9.x agent will not be +supported by the legacy source. The only supported 0.9.x mode is the +best effort, though the reliability setting of the 1.x flow will be +applicable to the events once they are saved into the Flume 1.x +channel by the legacy source. +==== + +Required properties are in *bold*. + +===== Avro Legacy Source + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `org.apache.flume.source.avroLegacy.AvroLegacySource` +|*host* |-- |The hostname or IP address to bind to +|*port* |-- |The port ++#++ to listen on +|selector.type | |replicating or multiplexing +|selector.++*++ |replicating |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = org.apache.flume.source.avroLegacy.AvroLegacySource +a1.sources.r1.host = 0.0.0.0 +a1.sources.r1.bind = 6666 +a1.sources.r1.channels = c1 +---- + +===== Thrift Legacy Source + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be `org.apache.flume.source.thriftLegacy.ThriftLegacySource` +|*host* |-- |The hostname or IP address to bind to +|*port* |-- |The port ++#++ to listen on +|selector.type | |replicating or multiplexing +|selector.++*++ |replicating |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = org.apache.flume.source.thriftLegacy.ThriftLegacySource +a1.sources.r1.host = 0.0.0.0 +a1.sources.r1.bind = 6666 +a1.sources.r1.channels = c1 +---- + +==== Custom Source + +A custom source is your own implementation of the Source interface. A custom +source's class and its dependencies must be included in the agent's classpath +when starting the Flume agent. The type of the custom source is its FQCN. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channels* |-- | +|*type* |-- |The component type name, needs to be your FQCN +|selector.type | |`replicating` or `multiplexing` +|selector.++*++ |replicating |Depends on the selector.type value +|interceptors |-- |Space-separated list of interceptors +|interceptors.++*++ | | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = org.example.MySource +a1.sources.r1.channels = c1 +---- + +==== Scribe Source + +Scribe is another type of ingest system. To adopt existing Scribe ingest system, +Flume should use ScribeSource based on Thrift with compatible transfering protocol. +For deployment of Scribe please follow the guide from Facebook. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `org.apache.flume.source.scribe.ScribeSource` +|port |1499 |Port that Scribe should be connected +|maxReadBufferBytes |16384000 |Thrift Default FrameBuffer Size +|workerThreads |5 |Handing threads number in Thrift +|selector.type | | +|selector.++*++ | | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.type = org.apache.flume.source.scribe.ScribeSource +a1.sources.r1.port = 1463 +a1.sources.r1.workerThreads = 5 +a1.sources.r1.channels = c1 +---- + +=== Flume Sinks + +==== HDFS Sink + +This sink writes events into the Hadoop Distributed File System (HDFS). It +currently supports creating text and sequence files. It supports compression in +both file types. The files can be rolled (close current file and create a new +one) periodically based on the elapsed time or size of data or number of events. +It also buckets/partitions data by attributes like timestamp or machine +where the event originated. The HDFS directory path may contain formatting +escape sequences that will replaced by the HDFS sink to generate a +directory/file name to store the events. Using this sink requires hadoop to be +installed so that Flume can use the Hadoop jars to communicate with the HDFS +cluster. Note that a version of Hadoop that supports the sync() call is +required. + +The following are the escape sequences supported: + +[cols=",",options="header",] +|=== +|Alias |Description +|%++{++host} |Substitute value of event header named "host". Arbitrary header names are supported. +|%t |Unix time in milliseconds +|%a |locale's short weekday name (Mon, Tue, ...) +|%A |locale's full weekday name (Monday, Tuesday, ...) +|%b |locale's short month name (Jan, Feb, ...) +|%B |locale's long month name (January, February, ...) +|%c |locale's date and time (Thu Mar 3 23:05:25 2005) +|%d |day of month (01) +|%e |day of month without padding (1) +|%D |date; same as %m/%d/%y +|%H |hour (00..23) +|%I |hour (01..12) +|%j |day of year (001..366) +|%k |hour ( 0..23) +|%m |month (01..12) +|%n |month without padding (1..12) +|%M |minute (00..59) +|%p |locale's equivalent of am or pm +|%s |seconds since 1970-01-01 00:00:00 UTC +|%S |second (00..59) +|%y |last two digits of year (00..99) +|%Y |year (2010) +|%z |{plus}hhmm numeric timezone (for example, -0400) +|%++[++localhost++]++ |Substitute the hostname of the host where the agent is running +|%++[++IP++]++ |Substitute the IP address of the host where the agent is running +|%++[++FQDN++]++ |Substitute the canonical hostname of the host where the agent is running +|=== + +Note: The escape strings %++[++localhost++]++, %++[++IP++]++ and %++[++FQDN++]++ all rely on Java's ability to obtain the +hostname, which may fail in some networking environments. + +The file in use will have the name mangled to include ".tmp" at the end. Once +the file is closed, this extension is removed. This allows excluding partially +complete files in the directory. +Required properties are in *bold*. + +[NOTE] +==== +For all of the time related escape sequences, a header with the key +"timestamp" must exist among the headers of the event (unless `hdfs.useLocalTimeStamp` is set to `true`). One way to add +this automatically is to use the TimestampInterceptor. +==== + +[cols=",,",options="header",] +|=== +|Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `hdfs` +|*hdfs.path* |-- |HDFS directory path (eg hdfs://namenode/flume/webdata/) +|hdfs.filePrefix |FlumeData |Name prefixed to files created by Flume in hdfs directory +|hdfs.fileSuffix |-- |Suffix to append to file (eg `.avro` - _NOTE: period is not automatically added_) +|hdfs.inUsePrefix |-- |Prefix that is used for temporal files that flume actively writes into +|hdfs.inUseSuffix |`.tmp` |Suffix that is used for temporal files that flume actively writes into +|hdfs.emptyInUseSuffix |false |If `false` an `hdfs.inUseSuffix` is used while writing the output. After closing the output `hdfs.inUseSuffix` is removed from the output file name. If `true` the `hdfs.inUseSuffix` parameter is ignored an empty string is used instead. +|hdfs.rollInterval |30 |Number of seconds to wait before rolling current file +(0 = never roll based on time interval) +|hdfs.rollSize |1024 |File size to trigger roll, in bytes (0: never roll based on file size) +|hdfs.rollCount |10 |Number of events written to file before it rolled +(0 = never roll based on number of events) +|hdfs.idleTimeout |0 |Timeout after which inactive files get closed +(0 = disable automatic closing of idle files) +|hdfs.batchSize |100 |number of events written to file before it is flushed to HDFS +|hdfs.codeC |-- |Compression codec. one of following : gzip, bzip2, lzo, lzop, snappy +|hdfs.fileType |SequenceFile |File format: currently `SequenceFile`, `DataStream` or `CompressedStream` +(1)DataStream will not compress output file and please don't set codeC +(2)CompressedStream requires set hdfs.codeC with an available codeC +|hdfs.maxOpenFiles |5000 |Allow only this number of open files. If this number is exceeded, the oldest file is closed. +|hdfs.minBlockReplicas |-- |Specify minimum number of replicas per HDFS block. If not specified, it comes from the default Hadoop config in the classpath. +|hdfs.writeFormat |Writable |Format for sequence file records. One of `Text` or `Writable`. Set to `Text` before creating data files with Flume, otherwise those files cannot be read by either Apache Impala (incubating) or Apache Hive. +|hdfs.threadsPoolSize |10 |Number of threads per HDFS sink for HDFS IO ops (open, write, etc.) +|hdfs.rollTimerPoolSize |1 |Number of threads per HDFS sink for scheduling timed file rolling +|hdfs.kerberosPrincipal |-- |Kerberos user principal for accessing secure HDFS +|hdfs.kerberosKeytab |-- |Kerberos keytab for accessing secure HDFS +|hdfs.proxyUser | | +|hdfs.round |false |Should the timestamp be rounded down (if true, affects all time based escape sequences except %t) +|hdfs.roundValue |1 |Rounded down to the highest multiple of this (in the unit configured using `hdfs.roundUnit`), less than current time. +|hdfs.roundUnit |second |The unit of the round down value - `second`, `minute` or `hour`. +|hdfs.timeZone |Local Time |Name of the timezone that should be used for resolving the directory path, e.g. America/Los++_++Angeles. +|hdfs.useLocalTimeStamp |false |Use the local time (instead of the timestamp from the event header) while replacing the escape sequences. +|hdfs.closeTries |0 |Number of times the sink must try renaming a file, after initiating a close attempt. If set to 1, this sink will not re-try a failed rename +(due to, for example, NameNode or DataNode failure), and may leave the file in an open state with a .tmp extension. +If set to 0, the sink will try to rename the file until the file is eventually renamed (there is no limit on the number of times it would try). +The file may still remain open if the close call fails but the data will be intact and in this case, the file will be closed only after a Flume restart. +|hdfs.retryInterval |180 |Time in seconds between consecutive attempts to close a file. Each close call costs multiple RPC round-trips to the Namenode, +so setting this too low can cause a lot of load on the name node. If set to 0 or less, the sink will not +attempt to close the file if the first attempt fails, and may leave the file open or with a ".tmp" extension. +|serializer |`TEXT` |Other possible options include `avro++_++event` or the +fully-qualified class name of an implementation of the +`EventSerializer.Builder` interface. +|serializer.++*++ | | +|=== + +Deprecated Properties + +[cols=",,",options="header",] +|=== +|Name |Default |Description +|hdfs.callTimeout |30000 |Number of milliseconds allowed for HDFS operations, such as open, write, flush, close. +This number should be increased if many HDFS timeout operations are occurring. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = hdfs +a1.sinks.k1.channel = c1 +a1.sinks.k1.hdfs.path = /flume/events/%Y-%m-%d/%H%M/%S +a1.sinks.k1.hdfs.filePrefix = events- +a1.sinks.k1.hdfs.round = true +a1.sinks.k1.hdfs.roundValue = 10 +a1.sinks.k1.hdfs.roundUnit = minute +---- + +The above configuration will round down the timestamp to the last 10th minute. For example, an event with +timestamp 11:54:34 AM, June 12, 2012 will cause the hdfs path to become `/flume/events/2012-06-12/1150/00`. + +==== Hive Sink + +This sink streams events containing delimited text or JSON data directly into a Hive table or partition. +Events are written using Hive transactions. As soon as a set of events are committed to Hive, they become +immediately visible to Hive queries. Partitions to which flume will stream to can either be pre-created +or, optionally, Flume can create them if they are missing. Fields from incoming event data are mapped to +corresponding columns in the Hive table. + +[cols=",,",options="header",] +|=== +|Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `hive` +|*hive.metastore* |-- |Hive metastore URI (eg thrift://a.b.com:9083 ) +|*hive.database* |-- |Hive database name +|*hive.table* |-- |Hive table name +|hive.partition |-- |Comma separate list of partition values identifying the partition to write to. May contain escape +sequences. E.g: If the table is partitioned by (continent: string, country :string, time : string) +then 'Asia,India,2014-02-26-01-21' will indicate continent=Asia,country=India,time=2014-02-26-01-21 +|hive.txnsPerBatchAsk |100 |Hive grants a _batch of transactions_ instead of single transactions to streaming clients like Flume. +This setting configures the number of desired transactions per Transaction Batch. Data from all +transactions in a single batch end up in a single file. Flume will write a maximum of batchSize events +in each transaction in the batch. This setting in conjunction with batchSize provides control over the +size of each file. Note that eventually Hive will transparently compact these files into larger files. +|heartBeatInterval |240 |(In seconds) Interval between consecutive heartbeats sent to Hive to keep unused transactions from expiring. +Set this value to 0 to disable heartbeats. +|autoCreatePartitions |true |Flume will automatically create the necessary Hive partitions to stream to +|batchSize |15000 |Max number of events written to Hive in a single Hive transaction +|maxOpenConnections |500 |Allow only this number of open connections. If this number is exceeded, the least recently used connection is closed. +|callTimeout |10000 |(In milliseconds) Timeout for Hive & HDFS I/O operations, such as openTxn, write, commit, abort. +|*serializer* | |Serializer is responsible for parsing out field from the event and mapping them to columns in the hive table. +Choice of serializer depends upon the format of the data in the event. Supported serializers: DELIMITED and JSON +|roundUnit |minute |The unit of the round down value - `second`, `minute` or `hour`. +|roundValue |1 |Rounded down to the highest multiple of this (in the unit configured using hive.roundUnit), less than current time +|timeZone |Local Time |Name of the timezone that should be used for resolving the escape sequences in partition, e.g. America/Los++_++Angeles. +|useLocalTimeStamp |false |Use the local time (instead of the timestamp from the event header) while replacing the escape sequences. +|=== + +Following serializers are provided for Hive sink: + +*JSON*: Handles UTF8 encoded Json (strict syntax) events and requires no configration. Object names +in the JSON are mapped directly to columns with the same name in the Hive table. +Internally uses org.apache.hive.hcatalog.data.JsonSerDe but is independent of the Serde of the Hive table. +This serializer requires HCatalog to be installed. + +*DELIMITED*: Handles simple delimited textual events. +Internally uses LazySimpleSerde but is independent of the Serde of the Hive table. + +[cols=",,",options="header",] +|=== +|Name |Default |Description +|serializer.delimiter |, |(Type: string) The field delimiter in the incoming data. To use special +characters, surround them with double quotes like "++\++t" +|*serializer.fieldnames* |-- |The mapping from input fields to columns in hive table. Specified as a +comma separated list (no spaces) of hive table columns names, identifying +the input fields in order of their occurrence. To skip fields leave the +column name unspecified. Eg. 'time,,ip,message' indicates the 1st, 3rd +and 4th fields in input map to time, ip and message columns in the hive table. +|serializer.serdeSeparator |Ctrl-A |(Type: character) Customizes the separator used by underlying serde. There +can be a gain in efficiency if the fields in serializer.fieldnames are in +same order as table columns, the serializer.delimiter is same as the +serializer.serdeSeparator and number of fields in serializer.fieldnames +is less than or equal to number of table columns, as the fields in incoming +event body do not need to be reordered to match order of table columns. +Use single quotes for special characters like '++\++t'. +Ensure input fields do not contain this character. NOTE: If serializer.delimiter +is a single character, preferably set this to the same character +|=== + +The following are the escape sequences supported: + +[cols=",",options="header",] +|=== +|Alias |Description +|%++{++host} |Substitute value of event header named "host". Arbitrary header names are supported. +|%t |Unix time in milliseconds +|%a |locale's short weekday name (Mon, Tue, ...) +|%A |locale's full weekday name (Monday, Tuesday, ...) +|%b |locale's short month name (Jan, Feb, ...) +|%B |locale's long month name (January, February, ...) +|%c |locale's date and time (Thu Mar 3 23:05:25 2005) +|%d |day of month (01) +|%D |date; same as %m/%d/%y +|%H |hour (00..23) +|%I |hour (01..12) +|%j |day of year (001..366) +|%k |hour ( 0..23) +|%m |month (01..12) +|%M |minute (00..59) +|%p |locale's equivalent of am or pm +|%s |seconds since 1970-01-01 00:00:00 UTC +|%S |second (00..59) +|%y |last two digits of year (00..99) +|%Y |year (2010) +|%z |{plus}hhmm numeric timezone (for example, -0400) +|=== + +[NOTE] +==== +For all of the time related escape sequences, a header with the key +"timestamp" must exist among the headers of the event (unless `useLocalTimeStamp` is set to `true`). One way to add +this automatically is to use the TimestampInterceptor. +==== + +Example Hive table : + +[source,properties] +---- +create table weblogs ( id int , msg string ) + partitioned by (continent string, country string, time string) + clustered by (id) into 5 buckets + stored as orc; +---- + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = memory +a1.sinks = k1 +a1.sinks.k1.type = hive +a1.sinks.k1.channel = c1 +a1.sinks.k1.hive.metastore = thrift://127.0.0.1:9083 +a1.sinks.k1.hive.database = logsdb +a1.sinks.k1.hive.table = weblogs +a1.sinks.k1.hive.partition = asia,%{country},%Y-%m-%d-%H-%M +a1.sinks.k1.useLocalTimeStamp = false +a1.sinks.k1.round = true +a1.sinks.k1.roundValue = 10 +a1.sinks.k1.roundUnit = minute +a1.sinks.k1.serializer = DELIMITED +a1.sinks.k1.serializer.delimiter = "\t" +a1.sinks.k1.serializer.serdeSeparator = '\t' +a1.sinks.k1.serializer.fieldnames =id,,msg +---- + +The above configuration will round down the timestamp to the last 10th minute. For example, an event with +timestamp header set to 11:54:34 AM, June 12, 2012 and 'country' header set to 'india' will evaluate to the +partition (continent='asia',country='india',time='2012-06-12-11-50'. The serializer is configured to +accept tab separated input containing three fields and to skip the second field. + +==== Logger Sink + +Logs event at INFO level. Typically useful for testing/debugging purpose. Required properties are +in *bold*. This sink is the only exception which doesn't require the extra configuration +explained in the link:#logging-raw-data[Logging raw data] section. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `logger` +|maxBytesToLog |16 |Maximum number of bytes of the Event body to log +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = logger +a1.sinks.k1.channel = c1 +---- + +==== Avro Sink + +This sink forms one half of Flume's tiered collection support. Flume events +sent to this sink are turned into Avro events and sent to the configured +hostname / port pair. The events are taken from the configured Channel in +batches of the configured batch size. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `avro`. +|*hostname* |-- |The hostname or IP address to bind to. +|*port* |-- |The port ++#++ to listen on. +|batch-size |100 |number of event to batch together for send. +|connect-timeout |20000 |Amount of time (ms) to allow for the first (handshake) request. +|request-timeout |20000 |Amount of time (ms) to allow for requests after the first. +|reset-connection-interval |none |Amount of time (s) before the connection to the next hop is reset. This will force the Avro Sink to reconnect to the next hop. This will allow the sink to connect to hosts behind a hardware load-balancer when news hosts are added without having to restart the agent. +|compression-type |none |This can be "none" or "deflate". The compression-type must match the compression-type of matching AvroSource +|compression-level |6 |The level of compression to compress event. 0 = no compression and 1-9 is compression. The higher the number the more compression +|ssl |false |Set to true to enable SSL for this AvroSink. When configuring SSL, you can optionally set a "truststore", "truststore-password", "truststore-type", and specify whether to "trust-all-certs". +|trust-all-certs |false |If this is set to true, SSL server certificates for remote servers (Avro Sources) will not be checked. This should NOT be used in production because it makes it easier for an attacker to execute a man-in-the-middle attack and "listen in" on the encrypted connection. +|truststore |-- |The path to a custom Java truststore file. Flume uses the certificate authority information in this file to determine whether the remote Avro Source's SSL authentication credentials should be trusted. If not specified, then the global keystore will be used. If the global keystore not specified either, then the default Java JSSE certificate authority files (typically "jssecacerts" or "cacerts" in the Oracle JRE) will be used. +|truststore-password |-- |The password for the truststore. If not specified, then the global keystore password will be used (if defined). +|truststore-type |JKS |The type of the Java truststore. This can be "JKS" or other supported Java truststore type. If not specified, then the global keystore type will be used (if defined, otherwise the defautl is JKS). +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude. SSLv3 will always be excluded in addition to the protocols specified. +|maxIoWorkers |2 ++*++ the number of available processors in the machine |The maximum number of I/O worker threads. This is configured on the NettyAvroRpcClient NioClientSocketChannelFactory. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = avro +a1.sinks.k1.channel = c1 +a1.sinks.k1.hostname = 10.10.10.10 +a1.sinks.k1.port = 4545 +---- + +==== Thrift Sink + +This sink forms one half of Flume's tiered collection support. Flume events +sent to this sink are turned into Thrift events and sent to the configured +hostname / port pair. The events are taken from the configured Channel in +batches of the configured batch size. + +Thrift sink can be configured to start in secure mode by enabling kerberos authentication. +To communicate with a Thrift source started in secure mode, the Thrift sink should also +operate in secure mode. client-principal and client-keytab are the properties used by the +Thrift sink to authenticate to the kerberos KDC. The server-principal represents the +principal of the Thrift source this sink is configured to connect to in secure mode. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `thrift`. +|*hostname* |-- |The hostname or IP address to bind to. +|*port* |-- |The port ++#++ to listen on. +|batch-size |100 |number of event to batch together for send. +|connect-timeout |20000 |Amount of time (ms) to allow for the first (handshake) request. +|request-timeout |20000 |Amount of time (ms) to allow for requests after the first. +|connection-reset-interval |none |Amount of time (s) before the connection to the next hop is reset. This will force the Thrift Sink to reconnect to the next hop. This will allow the sink to connect to hosts behind a hardware load-balancer when news hosts are added without having to restart the agent. +|ssl |false |Set to true to enable SSL for this ThriftSink. When configuring SSL, you can optionally set a "truststore", "truststore-password" and "truststore-type" +|truststore |-- |The path to a custom Java truststore file. Flume uses the certificate authority information in this file to determine whether the remote Thrift Source's SSL authentication credentials should be trusted. If not specified, then the global keystore will be used. If the global keystore not specified either, then the default Java JSSE certificate authority files (typically "jssecacerts" or "cacerts" in the Oracle JRE) will be used. +|truststore-password |-- |The password for the truststore. If not specified, then the global keystore password will be used (if defined). +|truststore-type |JKS |The type of the Java truststore. This can be "JKS" or other supported Java truststore type. If not specified, then the global keystore type will be used (if defined, otherwise the defautl is JKS). +|exclude-protocols |SSLv3 |Space-separated list of SSL/TLS protocols to exclude +|kerberos |false |Set to true to enable kerberos authentication. In kerberos mode, client-principal, client-keytab and server-principal are required for successful authentication and communication to a kerberos enabled Thrift Source. +|client-principal |—- |The kerberos principal used by the Thrift Sink to authenticate to the kerberos KDC. +|client-keytab |—- |The keytab location used by the Thrift Sink in combination with the client-principal to authenticate to the kerberos KDC. +|server-principal |-- |The kerberos principal of the Thrift Source to which the Thrift Sink is configured to connect to. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = thrift +a1.sinks.k1.channel = c1 +a1.sinks.k1.hostname = 10.10.10.10 +a1.sinks.k1.port = 4545 +---- + +==== IRC Sink + +The IRC sink takes messages from attached channel and relays those to +configured IRC destinations. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `irc` +|*hostname* |-- |The hostname or IP address to connect to +|port |6667 |The port number of remote host to connect +|*nick* |-- |Nick name +|user |-- |User name +|password |-- |User password +|*chan* |-- |channel +|name | | +|splitlines |-- |(boolean) +|splitchars |n |line separator (if you were to enter the default value +into the config file, then you would need to escape the +backslash, like this: "++\++n") +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = irc +a1.sinks.k1.channel = c1 +a1.sinks.k1.hostname = irc.yourdomain.com +a1.sinks.k1.nick = flume +a1.sinks.k1.chan = #flume +---- + +==== File Roll Sink + +Stores events on the local filesystem. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `file++_++roll`. +|*sink.directory* |-- |The directory where files will be stored +|sink.pathManager |DEFAULT |The PathManager implementation to use. +|sink.pathManager.extension |-- |The file extension if the default PathManager is used. +|sink.pathManager.prefix |-- |A character string to add to the beginning of the file name if the default PathManager is used +|sink.rollInterval |30 |Roll the file every 30 seconds. Specifying 0 will disable rolling and cause all events to be written to a single file. +|sink.serializer |TEXT |Other possible options include `avro++_++event` or the FQCN of an implementation of EventSerializer.Builder interface. +|sink.batchSize |100 | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = file_roll +a1.sinks.k1.channel = c1 +a1.sinks.k1.sink.directory = /var/log/flume +---- + +==== Null Sink + +Discards all events it receives from the channel. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `null`. +|batchSize |100 | +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = null +a1.sinks.k1.channel = c1 +---- + +==== HBaseSinks + +===== HBaseSink + +This sink writes data to HBase. The Hbase configuration is picked up from the first +hbase-site.xml encountered in the classpath. A class implementing HbaseEventSerializer +which is specified by the configuration is used to convert the events into +HBase puts and/or increments. These puts and increments are then written +to HBase. This sink provides the same consistency guarantees as HBase, +which is currently row-wise atomicity. In the event of Hbase failing to +write certain events, the sink will replay all events in that transaction. + +The HBaseSink supports writing data to secure HBase. To write to secure HBase, the user +the agent is running as must have write permissions to the table the sink is configured +to write to. The principal and keytab to use to authenticate against the KDC can be specified +in the configuration. The hbase-site.xml in the Flume agent's classpath +must have authentication set to `kerberos` (For details on how to do this, please refer to +HBase documentation). + +For convenience, two serializers are provided with Flume. The +SimpleHbaseEventSerializer (org.apache.flume.sink.hbase.SimpleHbaseEventSerializer) +writes the event body +as-is to HBase, and optionally increments a column in Hbase. This is primarily +an example implementation. The RegexHbaseEventSerializer +(org.apache.flume.sink.hbase.RegexHbaseEventSerializer) breaks the event body +based on the given regex and writes each part into different columns. + +The type is the FQCN: org.apache.flume.sink.hbase.HBaseSink. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `hbase` +|*table* |-- |The name of the table in Hbase to write to. +|*columnFamily* |-- |The column family in Hbase to write to. +|zookeeperQuorum |-- |The quorum spec. This is the value for the property `hbase.zookeeper.quorum` in hbase-site.xml +|znodeParent |/hbase |The base path for the znode for the -ROOT- region. Value of `zookeeper.znode.parent` in hbase-site.xml +|batchSize |100 |Number of events to be written per txn. +|coalesceIncrements |false |Should the sink coalesce multiple increments to a cell per batch. This might give +better performance if there are multiple increments to a limited number of cells. +|serializer |org.apache.flume.sink.hbase.SimpleHbaseEventSerializer |Default increment column = "iCol", payload column = "pCol". +|serializer.++*++ |-- |Properties to be passed to the serializer. +|kerberosPrincipal |-- |Kerberos user principal for accessing secure HBase +|kerberosKeytab |-- |Kerberos keytab for accessing secure HBase +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = hbase +a1.sinks.k1.table = foo_table +a1.sinks.k1.columnFamily = bar_cf +a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer +a1.sinks.k1.channel = c1 +---- + +===== HBase2Sink + +HBase2Sink is the equivalent of HBaseSink for HBase version 2. +The provided functionality and the configuration parameters are the same as in case of HBaseSink (except the hbase2 tag in the sink type and the package/class names). + +The type is the FQCN: org.apache.flume.sink.hbase2.HBase2Sink. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `hbase2` +|*table* |-- |The name of the table in HBase to write to. +|*columnFamily* |-- |The column family in HBase to write to. +|zookeeperQuorum |-- |The quorum spec. This is the value for the property `hbase.zookeeper.quorum` in hbase-site.xml +|znodeParent |/hbase |The base path for the znode for the -ROOT- region. Value of `zookeeper.znode.parent` in hbase-site.xml +|batchSize |100 |Number of events to be written per txn. +|coalesceIncrements |false |Should the sink coalesce multiple increments to a cell per batch. This might give +better performance if there are multiple increments to a limited number of cells. +|serializer |org.apache.flume.sink.hbase2.SimpleHBase2EventSerializer |Default increment column = "iCol", payload column = "pCol". +|serializer.++*++ |-- |Properties to be passed to the serializer. +|kerberosPrincipal |-- |Kerberos user principal for accessing secure HBase +|kerberosKeytab |-- |Kerberos keytab for accessing secure HBase +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = hbase2 +a1.sinks.k1.table = foo_table +a1.sinks.k1.columnFamily = bar_cf +a1.sinks.k1.serializer = org.apache.flume.sink.hbase2.RegexHBase2EventSerializer +a1.sinks.k1.channel = c1 +---- + +===== AsyncHBaseSink + +This sink writes data to HBase using an asynchronous model. A class implementing +AsyncHbaseEventSerializer which is specified by the configuration is used to convert the events into +HBase puts and/or increments. These puts and increments are then written +to HBase. This sink uses the https://github.com/OpenTSDB/asynchbase[Asynchbase API] to write to +HBase. This sink provides the same consistency guarantees as HBase, +which is currently row-wise atomicity. In the event of Hbase failing to +write certain events, the sink will replay all events in that transaction. +AsyncHBaseSink can only be used with HBase 1.x. The async client library used by AsyncHBaseSink is not available for HBase 2. +The type is the FQCN: org.apache.flume.sink.hbase.AsyncHBaseSink. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `asynchbase` +|*table* |-- |The name of the table in Hbase to write to. +|zookeeperQuorum |-- |The quorum spec. This is the value for the property `hbase.zookeeper.quorum` in hbase-site.xml +|znodeParent |/hbase |The base path for the znode for the -ROOT- region. Value of `zookeeper.znode.parent` in hbase-site.xml +|*columnFamily* |-- |The column family in Hbase to write to. +|batchSize |100 |Number of events to be written per txn. +|coalesceIncrements |false |Should the sink coalesce multiple increments to a cell per batch. This might give +better performance if there are multiple increments to a limited number of cells. +|timeout |60000 |The length of time (in milliseconds) the sink waits for acks from hbase for +all events in a transaction. +|serializer |org.apache.flume.sink.hbase.SimpleAsyncHbaseEventSerializer | +|serializer.++*++ |-- |Properties to be passed to the serializer. +|async.++*++ |-- |Properties to be passed to asyncHbase library. +These properties have precedence over the old `zookeeperQuorum` and `znodeParent` values. +You can find the list of the available properties at +https://opentsdb.github.io/asynchbase/docs/build/html/configuration.html#properties[the documentation page of AsyncHBase]. +|=== + +Note that this sink takes the Zookeeper Quorum and parent znode information in +the configuration. Zookeeper Quorum and parent node configuration may be +specified in the flume configuration file. Alternatively, these configuration +values are taken from the first hbase-site.xml file in the classpath. + +If these are not provided in the configuration, then the sink +will read this information from the first hbase-site.xml file in the classpath. + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = asynchbase +a1.sinks.k1.table = foo_table +a1.sinks.k1.columnFamily = bar_cf +a1.sinks.k1.serializer = org.apache.flume.sink.hbase.SimpleAsyncHbaseEventSerializer +a1.sinks.k1.channel = c1 +---- + +==== MorphlineSolrSink + +This sink extracts data from Flume events, transforms it, and loads it in near-real-time into Apache Solr servers, which in turn serve queries to end users or search applications. + +This sink is well suited for use cases that stream raw data into HDFS (via the HdfsSink) and simultaneously extract, transform and load the same data into Solr (via MorphlineSolrSink). In particular, this sink can process arbitrary heterogeneous raw data from disparate data sources and turn it into a data model that is useful to Search applications. + +The ETL functionality is customizable using a https://cloudera.github.io/cdk/docs/current/cdk-morphlines/index.html[morphline configuration file] that defines a chain of transformation commands that pipe event records from one command to another. + +Morphlines can be seen as an evolution of Unix pipelines where the data model is generalized to work with streams of generic records, including arbitrary binary payloads. A morphline command is a bit like a Flume Interceptor. Morphlines can be embedded into Hadoop components such as Flume. + +Commands to parse and transform a set of standard data formats such as log files, Avro, CSV, Text, HTML, XML, PDF, Word, Excel, etc. are provided out of the box, and additional custom commands and parsers for additional data formats can be added as morphline plugins. Any kind of data format can be indexed and any Solr documents for any kind of Solr schema can be generated, and any custom ETL logic can be registered and executed. + +Morphlines manipulate continuous streams of records. The data model can be described as follows: A record is a set of named fields where each field has an ordered list of one or more values. A value can be any Java Object. That is, a record is essentially a hash table where each hash table entry contains a String key and a list of Java Objects as values. (The implementation uses Guava's `ArrayListMultimap`, which is a `ListMultimap`). Note that a field can have multiple values and any two records need not use common field names. + +This sink fills the body of the Flume event into the `++_++attachment++_++body` field of the morphline record, as well as copies the headers of the Flume event into record fields of the same name. The commands can then act on this data. + +Routing to a SolrCloud cluster is supported to improve scalability. Indexing load can be spread across a large number of MorphlineSolrSinks for improved scalability. Indexing load can be replicated across multiple MorphlineSolrSinks for high availability, for example using Flume features such as Load balancing Sink Processor. MorphlineInterceptor can also help to implement dynamic routing to multiple Solr collections (e.g. for multi-tenancy). + +The morphline and solr jars required for your environment must be placed in the lib directory of the Apache Flume installation. + +The type is the FQCN: org.apache.flume.sink.solr.morphline.MorphlineSolrSink + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `org.apache.flume.sink.solr.morphline.MorphlineSolrSink` +|*morphlineFile* |-- |The relative or absolute path on the local file system to the morphline configuration file. Example: `/etc/flume-ng/conf/morphline.conf` +|morphlineId |null |Optional name used to identify a morphline if there are multiple morphlines in a morphline config file +|batchSize |1000 |The maximum number of events to take per flume transaction. +|batchDurationMillis |1000 |The maximum duration per flume transaction (ms). The transaction commits after this duration or when batchSize is exceeded, whichever comes first. +|handlerClass |org.apache.flume.sink.solr.morphline.MorphlineHandlerImpl |The FQCN of a class implementing org.apache.flume.sink.solr.morphline.MorphlineHandler +|isProductionMode |false |This flag should be enabled for mission critical, large-scale online production systems that need to make progress without downtime when unrecoverable exceptions occur. Corrupt or malformed parser input data, parser bugs, and errors related to unknown Solr schema fields produce unrecoverable exceptions. +|recoverableExceptionClasses |org.apache.solr.client.solrj.SolrServerException |Comma separated list of recoverable exceptions that tend to be transient, in which case the corresponding task can be retried. Examples include network connection errors, timeouts, etc. When the production mode flag is set to true, the recoverable exceptions configured using this parameter will not be ignored and hence will lead to retries. +|isIgnoringRecoverableExceptions |false |This flag should be enabled, if an unrecoverable exception is accidentally misclassified as recoverable. This enables the sink to make progress and avoid retrying an event forever. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = org.apache.flume.sink.solr.morphline.MorphlineSolrSink +a1.sinks.k1.channel = c1 +a1.sinks.k1.morphlineFile = /etc/flume-ng/conf/morphline.conf +# a1.sinks.k1.morphlineId = morphline1 +# a1.sinks.k1.batchSize = 1000 +# a1.sinks.k1.batchDurationMillis = 1000 +---- + +==== Kite Dataset Sink + +Experimental sink that writes events to a http://kitesdk.org/docs/current/guide/[Kite Dataset]. +This sink will deserialize the body of each incoming event and store the +resulting record in a Kite Dataset. It determines target Dataset by loading a +dataset by URI. + +The only supported serialization is avro, and the record schema must be passed +in the event headers, using either `flume.avro.schema.literal` with the JSON +schema representation or `flume.avro.schema.url` with a URL where the schema +may be found (`hdfs:/...` URIs are supported). This is compatible with the +Log4jAppender flume client and the spooling directory source's Avro +deserializer using `deserializer.schemaType = LITERAL`. + +Note 1: The `flume.avro.schema.hash` header is *not supported*. +Note 2: In some cases, file rolling may occur slightly after the roll interval +has been exceeded. However, this delay will not exceed 5 seconds. In most +cases, the delay is neglegible. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |Must be org.apache.flume.sink.kite.DatasetSink +|*kite.dataset.uri* |-- |URI of the dataset to open +|kite.repo.uri |-- |URI of the repository to open +(deprecated; use kite.dataset.uri instead) +|kite.dataset.namespace |-- |Namespace of the Dataset where records will be written +(deprecated; use kite.dataset.uri instead) +|kite.dataset.name |-- |Name of the Dataset where records will be written +(deprecated; use kite.dataset.uri instead) +|kite.batchSize |100 |Number of records to process in each batch +|kite.rollInterval |30 |Maximum wait time (seconds) before data files are released +|kite.flushable.commitOnBatch |true |If `true`, the Flume transaction will be commited and the +writer will be flushed on each batch of `kite.batchSize` +records. This setting only applies to flushable datasets. When +`true`, it's possible for temp files with commited data to be +left in the dataset directory. These files need to be recovered +by hand for the data to be visible to DatasetReaders. +|kite.syncable.syncOnBatch |true |Controls whether the sink will also sync data when committing +the transaction. This setting only applies to syncable datasets. +Syncing gaurentees that data will be written on stable storage +on the remote system while flushing only gaurentees that data +has left Flume's client buffers. When the +`kite.flushable.commitOnBatch` property is set to `false`, +this property must also be set to `false`. +|kite.entityParser |avro |Parser that turns Flume `Events` into Kite entities. +Valid values are `avro` and the fully-qualified class name +of an implementation of the `EntityParser.Builder` interface. +|kite.failurePolicy |retry |Policy that handles non-recoverable errors such as a missing +`Schema` in the `Event` header. The default value, `retry`, +will fail the current batch and try again which matches the old +behavior. Other valid values are `save`, which will write the +raw `Event` to the `kite.error.dataset.uri` dataset, and the +fully-qualified class name of an implementation of the +`FailurePolicy.Builder` interface. +|kite.error.dataset.uri |-- |URI of the dataset where failed events are saved when +`kite.failurePolicy` is set to `save`. *Required* when +the `kite.failurePolicy` is set to `save`. +|auth.kerberosPrincipal |-- |Kerberos user principal for secure authentication to HDFS +|auth.kerberosKeytab |-- |Kerberos keytab location (local FS) for the principal +|auth.proxyUser |-- |The effective user for HDFS actions, if different from +the kerberos principal +|=== + +==== Kafka Sink + +This is a Flume Sink implementation that can publish data to a +https://kafka.apache.org/[Kafka] topic. One of the objective is to integrate Flume +with Kafka so that pull based processing systems can process the data coming +through various Flume sources. + +This currently supports Kafka server releases 0.10.1.0 or higher. Testing was done up to 2.0.1 that was the highest avilable version at the time of the release. + +Required properties are marked in bold font. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |Must be set to `org.apache.flume.sink.kafka.KafkaSink` +|*kafka.bootstrap.servers* |-- |List of brokers Kafka-Sink will connect to, to get the list of topic partitions +This can be a partial list of brokers, but we recommend at least two for HA. +The format is comma separated list of hostname:port +|kafka.topic |default-flume-topic |The topic in Kafka to which the messages will be published. If this parameter is configured, +messages will be published to this topic. +If the event header contains a "topic" field, the event will be published to that topic +overriding the topic configured here. +Arbitrary header substitution is supported, eg. %++{++header} is replaced with value of event header named "header". +(If using the substitution, it is recommended to set "auto.create.topics.enable" property of Kafka broker to true.) +|flumeBatchSize |100 |How many messages to process in one batch. Larger batches improve throughput while adding latency. +|kafka.producer.acks |1 |How many replicas must acknowledge a message before its considered successfully written. +Accepted values are 0 (Never wait for acknowledgement), 1 (wait for leader only), -1 (wait for all replicas) +Set this to -1 to avoid data loss in some cases of leader failure. +|useFlumeEventFormat |false |By default events are put as bytes onto the Kafka topic directly from the event body. Set to +true to store events as the Flume Avro binary format. Used in conjunction with the same property +on the KafkaSource or with the parseAsFlumeEvent property on the Kafka Channel this will preserve +any Flume headers for the producing side. +|defaultPartitionId |-- |Specifies a Kafka partition ID (integer) for all events in this channel to be sent to, unless +overriden by `partitionIdHeader`. By default, if this property is not set, events will be +distributed by the Kafka Producer's partitioner - including by `key` if specified (or by a +partitioner specified by `kafka.partitioner.class`). +|partitionIdHeader |-- |When set, the sink will take the value of the field named using the value of this property +from the event header and send the message to the specified partition of the topic. If the +value represents an invalid partition, an EventDeliveryException will be thrown. If the header value +is present then this setting overrides `defaultPartitionId`. +|allowTopicOverride |true |When set, the sink will allow a message to be produced into a topic specified by the `topicHeader` property (if provided). +|topicHeader |topic |When set in conjunction with `allowTopicOverride` will produce a message into the value of the header named using the value of this property. +Care should be taken when using in conjunction with the Kafka Source `topicHeader` property to avoid creating a loopback. +|timestampHeader |-- |The header containing the caller provided timestamp value to use. If not provided the current time will +be used. +|header.NAME |-- |Used to identify which headers from the Flume Event should be passed to Kafka. The value of NAME should match +the Flume header name and the value should be the name of the header to be used as the Kafka header name. +|kafka.producer.security.protocol |PLAINTEXT |Set to SASL++_++PLAINTEXT, SASL++_++SSL or SSL if writing to Kafka using some level of security. See below for additional info on secure setup. +|_more producer security props_ | |If using SASL++_++PLAINTEXT, SASL++_++SSL or SSL refer to https://kafka.apache.org/documentation.html#security[Kafka security] for additional +properties that need to be set on producer. +|Other Kafka Producer Properties |-- |These properties are used to configure the Kafka Producer. Any producer property supported +by Kafka can be used. The only requirement is to prepend the property name with the prefix +`kafka.producer`. +For example: kafka.producer.linger.ms +|=== + +[NOTE] +==== +Kafka Sink uses the `topic` and `key` properties from the FlumeEvent headers to send events to Kafka. +If `topic` exists in the headers, the event will be sent to that specific topic, overriding the topic configured for the Sink. +If `key` exists in the headers, the key will used by Kafka to partition the data between the topic partitions. Events with same key +will be sent to the same partition. If the key is null, events will be sent to random partitions. +==== + +The Kafka sink also provides defaults for the key.serializer(org.apache.kafka.common.serialization.StringSerializer) +and value.serializer(org.apache.kafka.common.serialization.ByteArraySerializer). Modification of these parameters is not recommended. + +Deprecated Properties + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|brokerList |-- |Use kafka.bootstrap.servers +|topic |default-flume-topic |Use kafka.topic +|batchSize |100 |Use kafka.flumeBatchSize +|requiredAcks |1 |Use kafka.producer.acks +|=== + +An example configuration of a Kafka sink is given below. Properties starting +with the prefix `kafka.producer` the Kafka producer. The properties that are passed when creating the Kafka +producer are not limited to the properties given in this example. +Also it is possible to include your custom properties here and access them inside +the preprocessor through the Flume Context object passed in as a method +argument. + +[source,properties] +---- +a1.sinks.k1.channel = c1 +a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink +a1.sinks.k1.kafka.topic = mytopic +a1.sinks.k1.kafka.bootstrap.servers = localhost:9092 +a1.sinks.k1.kafka.flumeBatchSize = 20 +a1.sinks.k1.kafka.producer.acks = 1 +a1.sinks.k1.kafka.producer.linger.ms = 1 +a1.sinks.k1.kafka.producer.compression.type = snappy +---- + +*Security and Kafka Sink:* + +Secure authentication as well as data encryption is supported on the communication channel between Flume and Kafka. +For secure authentication SASL/GSSAPI (Kerberos V5) or SSL (even though the parameter is named SSL, the actual protocol is a TLS implementation) can be used from Kafka version 0.9.0. + +As of now data encryption is solely provided by SSL/TLS. + +Setting `kafka.producer.security.protocol` to any of the following value means: + +* *SASL++_++PLAINTEXT* - Kerberos or plaintext authentication with no data encryption +* *SASL++_++SSL* - Kerberos or plaintext authentication with data encryption +* *SSL* - TLS based encryption with optional authentication. + +[WARNING] +==== +There is a performance degradation when SSL is enabled, +the magnitude of which depends on the CPU type and the JVM implementation. +Reference: https://kafka.apache.org/documentation#security_overview[Kafka security overview] +and the jira for tracking this issue: +https://issues.apache.org/jira/browse/KAFKA-2561[KAFKA-2561] +==== + +*TLS and Kafka Sink:* + +Please read the steps described in https://kafka.apache.org/documentation#security_configclients[Configuring Kafka Clients SSL] +to learn about additional configuration settings for fine tuning for example any of the following: +security provider, cipher suites, enabled protocols, truststore or keystore types. + +Example configuration with server side authentication and data encryption. + +[source,properties] +---- +a1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSink +a1.sinks.sink1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.sinks.sink1.kafka.topic = mytopic +a1.sinks.sink1.kafka.producer.security.protocol = SSL +# optional, the global truststore can be used alternatively +a1.sinks.sink1.kafka.producer.ssl.truststore.location = /path/to/truststore.jks +a1.sinks.sink1.kafka.producer.ssl.truststore.password = +---- + +Specyfing the truststore is optional here, the global truststore can be used instead. +For more details about the global SSL setup, see the link:#ssltls-support[SSL/TLS support] section. + +Note: By default the property `ssl.endpoint.identification.algorithm` +is not defined, so hostname verification is not performed. +In order to enable hostname verification, set the following properties + +[source,properties] +---- +a1.sinks.sink1.kafka.producer.ssl.endpoint.identification.algorithm = HTTPS +---- + +Once enabled, clients will verify the server's fully qualified domain name (FQDN) +against one of the following two fields: + +. Common Name (CN) https://tools.ietf.org/html/rfc6125#section-2.3 +. Subject Alternative Name (SAN) https://tools.ietf.org/html/rfc5280#section-4.2.1.6 + +If client side authentication is also required then additionally the following needs to be added to Flume agent +configuration or the global SSL setup can be used (see link:#ssltls-support[SSL/TLS support] section). +Each Flume agent has to have its client certificate which has to be trusted by Kafka brokers either +individually or by their signature chain. Common example is to sign each client certificate by a single Root CA +which in turn is trusted by Kafka brokers. + +[source,properties] +---- +# optional, the global keystore can be used alternatively +a1.sinks.sink1.kafka.producer.ssl.keystore.location = /path/to/client.keystore.jks +a1.sinks.sink1.kafka.producer.ssl.keystore.password = +---- + +If keystore and key use different password protection then `ssl.key.password` property will +provide the required additional secret for producer keystore: + +[source,properties] +---- +a1.sinks.sink1.kafka.producer.ssl.key.password = +---- + +*Kerberos and Kafka Sink:* + +To use Kafka sink with a Kafka cluster secured with Kerberos, set the `producer.security.protocol` property noted above for producer. +The Kerberos keytab and principal to be used with Kafka brokers is specified in a JAAS file's "KafkaClient" section. "Client" section describes the Zookeeper connection if needed. +See https://kafka.apache.org/documentation.html#security_sasl_clientconfig[Kafka doc] +for information on the JAAS file contents. The location of this JAAS file and optionally the system wide kerberos configuration can be specified via JAVA++_++OPTS in flume-env.sh: + +[source,properties] +---- +JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/path/to/krb5.conf" +JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=/path/to/flume_jaas.conf" +---- + +Example secure configuration using SASL++_++PLAINTEXT: + +[source,properties] +---- +a1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSink +a1.sinks.sink1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.sinks.sink1.kafka.topic = mytopic +a1.sinks.sink1.kafka.producer.security.protocol = SASL_PLAINTEXT +a1.sinks.sink1.kafka.producer.sasl.mechanism = GSSAPI +a1.sinks.sink1.kafka.producer.sasl.kerberos.service.name = kafka +---- + +Example secure configuration using SASL++_++SSL: + +[source,properties] +---- +a1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSink +a1.sinks.sink1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.sinks.sink1.kafka.topic = mytopic +a1.sinks.sink1.kafka.producer.security.protocol = SASL_SSL +a1.sinks.sink1.kafka.producer.sasl.mechanism = GSSAPI +a1.sinks.sink1.kafka.producer.sasl.kerberos.service.name = kafka +# optional, the global truststore can be used alternatively +a1.sinks.sink1.kafka.producer.ssl.truststore.location = /path/to/truststore.jks +a1.sinks.sink1.kafka.producer.ssl.truststore.password = +---- + +Sample JAAS file. For reference of its content please see client config sections of the desired authentication mechanism (GSSAPI/PLAIN) +in Kafka documentation of https://kafka.apache.org/documentation#security_sasl_clientconfig[SASL configuration]. +Unlike the Kafka Source or Kafka Channel a "Client" section is not required, unless it is needed by other connecting components. Also please make sure +that the operating system user of the Flume processes has read privileges on the jaas and keytab files. + +[source,javascript] +---- +KafkaClient { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + keyTab="/path/to/keytabs/flume.keytab" + principal="flume/flumehost1.example.com@YOURKERBEROSREALM"; +}; +---- + +==== HTTP Sink + +Behaviour of this sink is that it will take events from the channel, and +send those events to a remote service using an HTTP POST request. The event +content is sent as the POST body. + +Error handling behaviour of this sink depends on the HTTP response returned +by the target server. The sink backoff/ready status is configurable, as is the +transaction commit/rollback result and whether the event contributes to the +successful event drain count. + +Any malformed HTTP response returned by the server where the status code is +not readable will result in a backoff signal and the event is not consumed +from the channel. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be `http`. +|*endpoint* |-- |The fully qualified URL endpoint to POST to +|connectTimeout |5000 |The socket connection timeout in milliseconds +|requestTimeout |5000 |The maximum request processing time in milliseconds +|contentTypeHeader |text/plain |The HTTP Content-Type header +|acceptHeader |text/plain |The HTTP Accept header value +|defaultBackoff |true |Whether to backoff by default on receiving all HTTP status codes +|defaultRollback |true |Whether to rollback by default on receiving all HTTP status codes +|defaultIncrementMetrics |false |Whether to increment metrics by default on receiving all HTTP status codes +|backoff.CODE |-- |Configures a specific backoff for an individual (i.e. 200) code or a group (i.e. 2XX) code +|rollback.CODE |-- |Configures a specific rollback for an individual (i.e. 200) code or a group (i.e. 2XX) code +|incrementMetrics.CODE |-- |Configures a specific metrics increment for an individual (i.e. 200) code or a group (i.e. 2XX) code +|=== + +Note that the most specific HTTP status code match is used for the backoff, +rollback and incrementMetrics configuration options. If there are configuration +values for both 2XX and 200 status codes, then 200 HTTP codes will use the 200 +value, and all other HTTP codes in the 201-299 range will use the 2XX value. + +Any empty or null events are consumed without any request being made to the +HTTP endpoint. + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = http +a1.sinks.k1.channel = c1 +a1.sinks.k1.endpoint = http://localhost:8080/someuri +a1.sinks.k1.connectTimeout = 2000 +a1.sinks.k1.requestTimeout = 2000 +a1.sinks.k1.acceptHeader = application/json +a1.sinks.k1.contentTypeHeader = application/json +a1.sinks.k1.defaultBackoff = true +a1.sinks.k1.defaultRollback = true +a1.sinks.k1.defaultIncrementMetrics = false +a1.sinks.k1.backoff.4XX = false +a1.sinks.k1.rollback.4XX = false +a1.sinks.k1.incrementMetrics.4XX = true +a1.sinks.k1.backoff.200 = false +a1.sinks.k1.rollback.200 = false +a1.sinks.k1.incrementMetrics.200 = true +---- + +==== Custom Sink + +A custom sink is your own implementation of the Sink interface. A custom +sink's class and its dependencies must be included in the agent's classpath +when starting the Flume agent. The type of the custom sink is its FQCN. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*channel* |-- | +|*type* |-- |The component type name, needs to be your FQCN +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.sinks = k1 +a1.sinks.k1.type = org.example.MySink +a1.sinks.k1.channel = c1 +---- + +=== Flume Channels + +Channels are the repositories where the events are staged on a agent. +Source adds the events and Sink removes it. + +==== Memory Channel + +The events are stored in an in-memory queue with configurable max size. It's +ideal for flows that need higher throughput and are prepared to lose the staged +data in the event of a agent failures. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `memory` +|capacity |100 |The maximum number of events stored in the channel +|transactionCapacity |100 |The maximum number of events the channel will take from a source or give to a +sink per transaction +|keep-alive |3 |Timeout in seconds for adding or removing an event +|byteCapacityBufferPercentage |20 |Defines the percent of buffer between byteCapacity and the estimated total size +of all events in the channel, to account for data in headers. See below. +|byteCapacity |see description |Maximum total *bytes* of memory allowed as a sum of all events in this channel. +The implementation only counts the Event `body`, which is the reason for +providing the `byteCapacityBufferPercentage` configuration parameter as well. +Defaults to a computed value equal to 80% of the maximum memory available to +the JVM (i.e. 80% of the -Xmx value passed on the command line). +Note that if you have multiple memory channels on a single JVM, and they happen +to hold the same physical events (i.e. if you are using a replicating channel +selector from a single source) then those event sizes may be double-counted for +channel byteCapacity purposes. +Setting this value to `0` will cause this value to fall back to a hard +internal limit of about 200 GB. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = memory +a1.channels.c1.capacity = 10000 +a1.channels.c1.transactionCapacity = 10000 +a1.channels.c1.byteCapacityBufferPercentage = 20 +a1.channels.c1.byteCapacity = 800000 +---- + +==== JDBC Channel + +The events are stored in a persistent storage that's backed by a database. +The JDBC channel currently supports embedded Derby. This is a durable channel +that's ideal for flows where recoverability is important. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `jdbc` +|db.type |DERBY |Database vendor, needs to be DERBY. +|driver.class |org.apache.derby.jdbc.EmbeddedDriver |Class for vendor's JDBC driver +|driver.url |(constructed from other properties) |JDBC connection URL +|db.username |"sa" |User id for db connection +|db.password |-- |password for db connection +|connection.properties.file |-- |JDBC Connection property file path +|create.schema |true |If true, then creates db schema if not there +|create.index |true |Create indexes to speed up lookups +|create.foreignkey |true | +|transaction.isolation |"READ++_++COMMITTED" |Isolation level for db session READ++_++UNCOMMITTED, +READ++_++COMMITTED, SERIALIZABLE, REPEATABLE++_++READ +|maximum.connections |10 |Max connections allowed to db +|maximum.capacity |0 (unlimited) |Max number of events in the channel +|sysprop.++*++ | |DB Vendor specific properties +|sysprop.user.home | |Home path to store embedded Derby database +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = jdbc +---- + +==== Kafka Channel + +The events are stored in a Kafka cluster (must be installed separately). Kafka provides high availability and +replication, so in case an agent or a kafka broker crashes, the events are immediately available to other sinks + +The Kafka channel can be used for multiple scenarios: + +. With Flume source and sink - it provides a reliable and highly available channel for events +. With Flume source and interceptor but no sink - it allows writing Flume events into a Kafka topic, for use by other apps +. With Flume sink, but no source - it is a low-latency, fault tolerant way to send events from Kafka to Flume sinks such as HDFS, HBase or Solr + +This currently supports Kafka server releases 0.10.1.0 or higher. Testing was done up to 2.0.1 that was the highest avilable version at the time of the release. + +The configuration parameters are organized as such: + +. Configuration values related to the channel generically are applied at the channel config level, eg: a1.channel.k1.type = +. Configuration values related to Kafka or how the Channel operates are prefixed with "kafka.", (this are analgous to CommonClient Configs) eg: a1.channels.k1.kafka.topic and a1.channels.k1.kafka.bootstrap.servers. This is not dissimilar to how the hdfs sink operates +. Properties specific to the producer/consumer are prefixed by kafka.producer or kafka.consumer +. Where possible, the Kafka paramter names are used, eg: bootstrap.servers and acks + +This version of flume is backwards-compatible with previous versions, however deprecated properties are indicated in the table below and a warning message +is logged on startup when they are present in the configuration file. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `org.apache.flume.channel.kafka.KafkaChannel` +|*kafka.bootstrap.servers* |-- |List of brokers in the Kafka cluster used by the channel +This can be a partial list of brokers, but we recommend at least two for HA. +The format is comma separated list of hostname:port +|kafka.topic |flume-channel |Kafka topic which the channel will use +|kafka.consumer.group.id |flume |Consumer group ID the channel uses to register with Kafka. +Multiple channels must use the same topic and group to ensure that when one agent fails another can get the data +Note that having non-channel consumers with the same ID can lead to data loss. +|parseAsFlumeEvent |true |Expecting Avro datums with FlumeEvent schema in the channel. +This should be true if Flume source is writing to the channel and false if other producers are +writing into the topic that the channel is using. Flume source messages to Kafka can be parsed outside of Flume by using +org.apache.flume.source.avro.AvroFlumeEvent provided by the flume-ng-sdk artifact +|pollTimeout |500 |The amount of time(in milliseconds) to wait in the "poll()" call of the consumer. +https://kafka.apache.org/090/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#poll(long) +|defaultPartitionId |-- |Specifies a Kafka partition ID (integer) for all events in this channel to be sent to, unless +overriden by `partitionIdHeader`. By default, if this property is not set, events will be +distributed by the Kafka Producer's partitioner - including by `key` if specified (or by a +partitioner specified by `kafka.partitioner.class`). +|partitionIdHeader |-- |When set, the producer will take the value of the field named using the value of this property +from the event header and send the message to the specified partition of the topic. If the +value represents an invalid partition the event will not be accepted into the channel. If the header value +is present then this setting overrides `defaultPartitionId`. +|kafka.consumer.auto.offset.reset |latest |What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server +(e.g. because that data has been deleted): +earliest: automatically reset the offset to the earliest offset +latest: automatically reset the offset to the latest offset +none: throw exception to the consumer if no previous offset is found for the consumer's group +anything else: throw exception to the consumer. +|kafka.producer.security.protocol |PLAINTEXT |Set to SASL++_++PLAINTEXT, SASL++_++SSL or SSL if writing to Kafka using some level of security. See below for additional info on secure setup. +|kafka.consumer.security.protocol |PLAINTEXT |Same as kafka.producer.security.protocol but for reading/consuming from Kafka. +|_more producer/consumer security props_ | |If using SASL++_++PLAINTEXT, SASL++_++SSL or SSL refer to https://kafka.apache.org/documentation.html#security[Kafka security] for additional +properties that need to be set on producer/consumer. +|=== + +Deprecated Properties + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|brokerList |-- |List of brokers in the Kafka cluster used by the channel +This can be a partial list of brokers, but we recommend at least two for HA. +The format is comma separated list of hostname:port +|topic |flume-channel |Use kafka.topic +|groupId |flume |Use kafka.consumer.group.id +|readSmallestOffset |false |Use kafka.consumer.auto.offset.reset +|migrateZookeeperOffsets |true |When no Kafka stored offset is found, look up the offsets in Zookeeper and commit them to Kafka. +This should be true to support seamless Kafka client migration from older versions of Flume. Once migrated this can be set +to false, though that should generally not be required. If no Zookeeper offset is found the kafka.consumer.auto.offset.reset +configuration defines how offsets are handled. +|=== + +[NOTE] +==== +Due to the way the channel is load balanced, there may be duplicate events when the agent first starts up +==== + +Example for agent named a1: + +[source,properties] +---- +a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel +a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9092,kafka-2:9092,kafka-3:9092 +a1.channels.channel1.kafka.topic = channel1 +a1.channels.channel1.kafka.consumer.group.id = flume-consumer +---- + +*Security and Kafka Channel:* + +Secure authentication as well as data encryption is supported on the communication channel between Flume and Kafka. +For secure authentication SASL/GSSAPI (Kerberos V5) or SSL (even though the parameter is named SSL, the actual protocol is a TLS implementation) can be used from Kafka version 0.9.0. + +As of now data encryption is solely provided by SSL/TLS. + +Setting `kafka.producer++|++consumer.security.protocol` to any of the following value means: + +* *SASL++_++PLAINTEXT* - Kerberos or plaintext authentication with no data encryption +* *SASL++_++SSL* - Kerberos or plaintext authentication with data encryption +* *SSL* - TLS based encryption with optional authentication. + +[WARNING] +==== +There is a performance degradation when SSL is enabled, +the magnitude of which depends on the CPU type and the JVM implementation. +Reference: https://kafka.apache.org/documentation#security_overview[Kafka security overview] +and the jira for tracking this issue: +https://issues.apache.org/jira/browse/KAFKA-2561[KAFKA-2561] +==== + +*TLS and Kafka Channel:* + +Please read the steps described in https://kafka.apache.org/documentation#security_configclients[Configuring Kafka Clients SSL] +to learn about additional configuration settings for fine tuning for example any of the following: +security provider, cipher suites, enabled protocols, truststore or keystore types. + +Example configuration with server side authentication and data encryption. + +[source,properties] +---- +a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel +a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.channels.channel1.kafka.topic = channel1 +a1.channels.channel1.kafka.consumer.group.id = flume-consumer +a1.channels.channel1.kafka.producer.security.protocol = SSL +# optional, the global truststore can be used alternatively +a1.channels.channel1.kafka.producer.ssl.truststore.location = /path/to/truststore.jks +a1.channels.channel1.kafka.producer.ssl.truststore.password = +a1.channels.channel1.kafka.consumer.security.protocol = SSL +# optional, the global truststore can be used alternatively +a1.channels.channel1.kafka.consumer.ssl.truststore.location = /path/to/truststore.jks +a1.channels.channel1.kafka.consumer.ssl.truststore.password = +---- + +Specyfing the truststore is optional here, the global truststore can be used instead. +For more details about the global SSL setup, see the link:#ssltls-support[SSL/TLS support] section. + +Note: By default the property `ssl.endpoint.identification.algorithm` +is not defined, so hostname verification is not performed. +In order to enable hostname verification, set the following properties + +[source,properties] +---- +a1.channels.channel1.kafka.producer.ssl.endpoint.identification.algorithm = HTTPS +a1.channels.channel1.kafka.consumer.ssl.endpoint.identification.algorithm = HTTPS +---- + +Once enabled, clients will verify the server's fully qualified domain name (FQDN) +against one of the following two fields: + +. Common Name (CN) https://tools.ietf.org/html/rfc6125#section-2.3 +. Subject Alternative Name (SAN) https://tools.ietf.org/html/rfc5280#section-4.2.1.6 + +If client side authentication is also required then additionally the following needs to be added to Flume agent +configuration or the global SSL setup can be used (see link:#ssltls-support[SSL/TLS support] section). +Each Flume agent has to have its client certificate which has to be trusted by Kafka brokers either +individually or by their signature chain. Common example is to sign each client certificate by a single Root CA +which in turn is trusted by Kafka brokers. + +[source,properties] +---- +# optional, the global keystore can be used alternatively +a1.channels.channel1.kafka.producer.ssl.keystore.location = /path/to/client.keystore.jks +a1.channels.channel1.kafka.producer.ssl.keystore.password = +# optional, the global keystore can be used alternatively +a1.channels.channel1.kafka.consumer.ssl.keystore.location = /path/to/client.keystore.jks +a1.channels.channel1.kafka.consumer.ssl.keystore.password = +---- + +If keystore and key use different password protection then `ssl.key.password` property will +provide the required additional secret for both consumer and producer keystores: + +[source,properties] +---- +a1.channels.channel1.kafka.producer.ssl.key.password = +a1.channels.channel1.kafka.consumer.ssl.key.password = +---- + +*Kerberos and Kafka Channel:* + +To use Kafka channel with a Kafka cluster secured with Kerberos, set the `producer/consumer.security.protocol` properties noted above for producer and/or consumer. +The Kerberos keytab and principal to be used with Kafka brokers is specified in a JAAS file's "KafkaClient" section. "Client" section describes the Zookeeper connection if needed. +See https://kafka.apache.org/documentation.html#security_sasl_clientconfig[Kafka doc] +for information on the JAAS file contents. The location of this JAAS file and optionally the system wide kerberos configuration can be specified via JAVA++_++OPTS in flume-env.sh: + +[source,properties] +---- +JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/path/to/krb5.conf" +JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=/path/to/flume_jaas.conf" +---- + +Example secure configuration using SASL++_++PLAINTEXT: + +[source,properties] +---- +a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel +a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.channels.channel1.kafka.topic = channel1 +a1.channels.channel1.kafka.consumer.group.id = flume-consumer +a1.channels.channel1.kafka.producer.security.protocol = SASL_PLAINTEXT +a1.channels.channel1.kafka.producer.sasl.mechanism = GSSAPI +a1.channels.channel1.kafka.producer.sasl.kerberos.service.name = kafka +a1.channels.channel1.kafka.consumer.security.protocol = SASL_PLAINTEXT +a1.channels.channel1.kafka.consumer.sasl.mechanism = GSSAPI +a1.channels.channel1.kafka.consumer.sasl.kerberos.service.name = kafka +---- + +Example secure configuration using SASL++_++SSL: + +[source,properties] +---- +a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel +a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9093,kafka-2:9093,kafka-3:9093 +a1.channels.channel1.kafka.topic = channel1 +a1.channels.channel1.kafka.consumer.group.id = flume-consumer +a1.channels.channel1.kafka.producer.security.protocol = SASL_SSL +a1.channels.channel1.kafka.producer.sasl.mechanism = GSSAPI +a1.channels.channel1.kafka.producer.sasl.kerberos.service.name = kafka +# optional, the global truststore can be used alternatively +a1.channels.channel1.kafka.producer.ssl.truststore.location = /path/to/truststore.jks +a1.channels.channel1.kafka.producer.ssl.truststore.password = +a1.channels.channel1.kafka.consumer.security.protocol = SASL_SSL +a1.channels.channel1.kafka.consumer.sasl.mechanism = GSSAPI +a1.channels.channel1.kafka.consumer.sasl.kerberos.service.name = kafka +# optional, the global truststore can be used alternatively +a1.channels.channel1.kafka.consumer.ssl.truststore.location = /path/to/truststore.jks +a1.channels.channel1.kafka.consumer.ssl.truststore.password = +---- + +Sample JAAS file. For reference of its content please see client config sections of the desired authentication mechanism (GSSAPI/PLAIN) +in Kafka documentation of https://kafka.apache.org/documentation#security_sasl_clientconfig[SASL configuration]. +Since the Kafka Source may also connect to Zookeeper for offset migration, the "Client" section was also added to this example. +This won't be needed unless you require offset migration, or you require this section for other secure components. +Also please make sure that the operating system user of the Flume processes has read privileges on the jaas and keytab files. + +[source,javascript] +---- +Client { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + keyTab="/path/to/keytabs/flume.keytab" + principal="flume/flumehost1.example.com@YOURKERBEROSREALM"; +}; + +KafkaClient { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + keyTab="/path/to/keytabs/flume.keytab" + principal="flume/flumehost1.example.com@YOURKERBEROSREALM"; +}; +---- + +==== File Channel + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name Default |Description | +|*type* |-- |The component type name, needs to be `file`. +|checkpointDir |~/.flume/file-channel/checkpoint |The directory where checkpoint file will be stored +|useDualCheckpoints |false |Backup the checkpoint. If this is set to `true`, `backupCheckpointDir` *must* be set +|backupCheckpointDir |-- |The directory where the checkpoint is backed up to. This directory *must not* be the same as the data directories or the checkpoint directory +|dataDirs |~/.flume/file-channel/data |Comma separated list of directories for storing log files. Using multiple directories on separate disks can improve file channel peformance +|transactionCapacity |10000 |The maximum size of transaction supported by the channel +|checkpointInterval |30000 |Amount of time (in millis) between checkpoints +|maxFileSize |2146435071 |Max size (in bytes) of a single log file +|minimumRequiredSpace |524288000 |Minimum Required free space (in bytes). To avoid data corruption, File Channel stops accepting take/put requests when free space drops below this value +|capacity |1000000 |Maximum capacity of the channel +|keep-alive |3 |Amount of time (in sec) to wait for a put operation +|use-log-replay-v1 |false |Expert: Use old replay logic +|use-fast-replay |false |Expert: Replay without using queue +|checkpointOnClose |true |Controls if a checkpoint is created when the channel is closed. Creating a checkpoint on close speeds up subsequent startup of the file channel by avoiding replay. +|encryption.activeKey |-- |Key name used to encrypt new data +|encryption.cipherProvider |-- |Cipher provider type, supported types: AESCTRNOPADDING +|encryption.keyProvider |-- |Key provider type, supported types: JCEKSFILE +|encryption.keyProvider.keyStoreFile |-- |Path to the keystore file +|encrpytion.keyProvider.keyStorePasswordFile |-- |Path to the keystore password file +|encryption.keyProvider.keys |-- |List of all keys (e.g. history of the activeKey setting) +|encyption.keyProvider.keys.++*++.passwordFile |-- |Path to the optional key password file +|=== + +[NOTE] +==== +By default the File Channel uses paths for checkpoint and data +directories that are within the user home as specified above. +As a result if you have more than one File Channel instances +active within the agent, only one will be able to lock the +directories and cause the other channel initialization to fail. +It is therefore necessary that you provide explicit paths to +all the configured channels, preferably on different disks. +Furthermore, as file channel will sync to disk after every commit, +coupling it with a sink/source that batches events together may +be necessary to provide good performance where multiple disks are +not available for checkpoint and data directories. +==== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = file +a1.channels.c1.checkpointDir = /mnt/flume/checkpoint +a1.channels.c1.dataDirs = /mnt/flume/data +---- + +*Encryption* + +Below is a few sample configurations: + +Generating a key with a password seperate from the key store password: + +[source,bash] +---- +keytool -genseckey -alias key-0 -keypass keyPassword -keyalg AES \ + -keysize 128 -validity 9000 -keystore test.keystore \ + -storetype jceks -storepass keyStorePassword +---- + +Generating a key with the password the same as the key store password: + +[source,bash] +---- +keytool -genseckey -alias key-1 -keyalg AES -keysize 128 -validity 9000 \ + -keystore src/test/resources/test.keystore -storetype jceks \ + -storepass keyStorePassword +---- + +[source,properties] +---- +a1.channels.c1.encryption.activeKey = key-0 +a1.channels.c1.encryption.cipherProvider = AESCTRNOPADDING +a1.channels.c1.encryption.keyProvider = key-provider-0 +a1.channels.c1.encryption.keyProvider = JCEKSFILE +a1.channels.c1.encryption.keyProvider.keyStoreFile = /path/to/my.keystore +a1.channels.c1.encryption.keyProvider.keyStorePasswordFile = /path/to/my.keystore.password +a1.channels.c1.encryption.keyProvider.keys = key-0 +---- + +Let's say you have aged key-0 out and new files should be encrypted with key-1: + +[source,properties] +---- +a1.channels.c1.encryption.activeKey = key-1 +a1.channels.c1.encryption.cipherProvider = AESCTRNOPADDING +a1.channels.c1.encryption.keyProvider = JCEKSFILE +a1.channels.c1.encryption.keyProvider.keyStoreFile = /path/to/my.keystore +a1.channels.c1.encryption.keyProvider.keyStorePasswordFile = /path/to/my.keystore.password +a1.channels.c1.encryption.keyProvider.keys = key-0 key-1 +---- + +The same scenerio as above, however key-0 has its own password: + +[source,properties] +---- +a1.channels.c1.encryption.activeKey = key-1 +a1.channels.c1.encryption.cipherProvider = AESCTRNOPADDING +a1.channels.c1.encryption.keyProvider = JCEKSFILE +a1.channels.c1.encryption.keyProvider.keyStoreFile = /path/to/my.keystore +a1.channels.c1.encryption.keyProvider.keyStorePasswordFile = /path/to/my.keystore.password +a1.channels.c1.encryption.keyProvider.keys = key-0 key-1 +a1.channels.c1.encryption.keyProvider.keys.key-0.passwordFile = /path/to/key-0.password +---- + +==== Spillable Memory Channel + +The events are stored in an in-memory queue and on disk. The in-memory queue serves as the primary store and the disk as overflow. +The disk store is managed using an embedded File channel. When the in-memory queue is full, additional incoming events are stored in +the file channel. This channel is ideal for flows that need high throughput of memory channel during normal operation, but at the +same time need the larger capacity of the file channel for better tolerance of intermittent sink side outages or drop in drain rates. +The throughput will reduce approximately to file channel speeds during such abnormal situations. In case of an agent crash or restart, +only the events stored on disk are recovered when the agent comes online. *This channel is currently experimental and +not recommended for use in production.* + +Required properties are in *bold*. Please refer to file channel for additional required properties. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `SPILLABLEMEMORY` +|memoryCapacity |10000 |Maximum number of events stored in memory queue. To disable use of in-memory queue, set this to zero. +|overflowCapacity |100000000 |Maximum number of events stored in overflow disk (i.e File channel). To disable use of overflow, set this to zero. +|overflowTimeout |3 |The number of seconds to wait before enabling disk overflow when memory fills up. +|byteCapacityBufferPercentage |20 |Defines the percent of buffer between byteCapacity and the estimated total size +of all events in the channel, to account for data in headers. See below. +|byteCapacity |see description |Maximum *bytes* of memory allowed as a sum of all events in the memory queue. +The implementation only counts the Event `body`, which is the reason for +providing the `byteCapacityBufferPercentage` configuration parameter as well. +Defaults to a computed value equal to 80% of the maximum memory available to +the JVM (i.e. 80% of the -Xmx value passed on the command line). +Note that if you have multiple memory channels on a single JVM, and they happen +to hold the same physical events (i.e. if you are using a replicating channel +selector from a single source) then those event sizes may be double-counted for +channel byteCapacity purposes. +Setting this value to `0` will cause this value to fall back to a hard +internal limit of about 200 GB. +|avgEventSize |500 |Estimated average size of events, in bytes, going into the channel +|++<++file channel properties++>++ |see file channel |Any file channel property with the exception of 'keep-alive' and 'capacity' can be used. +The keep-alive of file channel is managed by Spillable Memory Channel. Use 'overflowCapacity' +to set the File channel's capacity. +|=== + +In-memory queue is considered full if either memoryCapacity or byteCapacity limit is reached. + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = SPILLABLEMEMORY +a1.channels.c1.memoryCapacity = 10000 +a1.channels.c1.overflowCapacity = 1000000 +a1.channels.c1.byteCapacity = 800000 +a1.channels.c1.checkpointDir = /mnt/flume/checkpoint +a1.channels.c1.dataDirs = /mnt/flume/data +---- + +To disable the use of the in-memory queue and function like a file channel: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = SPILLABLEMEMORY +a1.channels.c1.memoryCapacity = 0 +a1.channels.c1.overflowCapacity = 1000000 +a1.channels.c1.checkpointDir = /mnt/flume/checkpoint +a1.channels.c1.dataDirs = /mnt/flume/data +---- + +To disable the use of overflow disk and function purely as a in-memory channel: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = SPILLABLEMEMORY +a1.channels.c1.memoryCapacity = 100000 +a1.channels.c1.overflowCapacity = 0 +---- + +==== Pseudo Transaction Channel + +[WARNING] +==== +The Pseudo Transaction Channel is only for unit testing purposes +and is NOT meant for production use. +==== + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be `org.apache.flume.channel.PseudoTxnMemoryChannel` +|capacity |50 |The max number of events stored in the channel +|keep-alive |3 |Timeout in seconds for adding or removing an event +|=== + +==== Custom Channel + +A custom channel is your own implementation of the Channel interface. A +custom channel's class and its dependencies must be included in the agent's +classpath when starting the Flume agent. The type of the custom channel is +its FQCN. +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, needs to be a FQCN +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.channels = c1 +a1.channels.c1.type = org.example.MyChannel +---- + +=== Flume Channel Selectors + +If the type is not specified, then defaults to "replicating". + +==== Replicating Channel Selector (default) + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|selector.type |replicating |The component type name, needs to be `replicating` +|selector.optional |-- |Set of channels to be marked as `optional` +|=== + +Example for agent named a1 and it's source called r1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 c2 c3 +a1.sources.r1.selector.type = replicating +a1.sources.r1.channels = c1 c2 c3 +a1.sources.r1.selector.optional = c3 +---- + +In the above configuration, c3 is an optional channel. Failure to write to c3 is +simply ignored. Since c1 and c2 are not marked optional, failure to write to +those channels will cause the transaction to fail. + +==== Load Balancing Channel Selector + +Load balancing channel selector provides the ability to load-balance flow over multiple channels. This +effectively allows the incoming data to be processed on multiple threads. It maintains an indexed list of active channels on which the load must be distributed. Implementation supports distributing load using either via round++_++robin or random selection mechanisms. The choice of selection mechanism defaults to round++_++robin type, but can be overridden via configuration. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|selector.type |replicating |The component type name, needs to be `load++_++balancing` +|selector.policy |`round++_++robin` |Selection mechanism. Must be either `round++_++robin` or `random`. +|=== + +Example for agent named a1 and it's source called r1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 c2 c3 c4 +a1.sources.r1.channels = c1 c2 c3 c4 +a1.sources.r1.selector.type = load_balancing +a1.sources.r1.selector.policy = round_robin +---- + +==== Multiplexing Channel Selector + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|selector.type |replicating |The component type name, needs to be `multiplexing` +|selector.header |flume.selector.header | +|selector.default |-- | +|selector.mapping.++*++ |-- | +|=== + +Example for agent named a1 and it's source called r1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 c2 c3 c4 +a1.sources.r1.selector.type = multiplexing +a1.sources.r1.selector.header = state +a1.sources.r1.selector.mapping.CZ = c1 +a1.sources.r1.selector.mapping.US = c2 c3 +a1.sources.r1.selector.default = c4 +---- + +==== Custom Channel Selector + +A custom channel selector is your own implementation of the ChannelSelector +interface. A custom channel selector's class and its dependencies must be +included in the agent's classpath when starting the Flume agent. The type of +the custom channel selector is its FQCN. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|selector.type |-- |The component type name, needs to be your FQCN +|=== + +Example for agent named a1 and its source called r1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.selector.type = org.example.MyChannelSelector +---- + +=== Flume Sink Processors + +Sink groups allow users to group multiple sinks into one entity. +Sink processors can be used to provide load balancing capabilities over all +sinks inside the group or to achieve fail over from one sink to another in +case of temporal failure. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*sinks* |-- |Space-separated list of sinks that are participating in the group +|*processor.type* |`default` |The component type name, needs to be `default`, `failover` or `load++_++balance` +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sinkgroups = g1 +a1.sinkgroups.g1.sinks = k1 k2 +a1.sinkgroups.g1.processor.type = load_balance +---- + +==== Default Sink Processor + +Default sink processor accepts only a single sink. User is not forced +to create processor (sink group) for single sinks. Instead user can follow +the source - channel - sink pattern that was explained above in this user +guide. + +==== Failover Sink Processor + +Failover Sink Processor maintains a prioritized list of sinks, guaranteeing +that so long as one is available events will be processed (delivered). + +The failover mechanism works by relegating failed sinks to a pool where +they are assigned a cool down period, increasing with sequential failures +before they are retried. Once a sink successfully sends an event, it is +restored to the live pool. The Sinks have a priority associated with them, +larger the number, higher the priority. If a Sink fails while sending a Event +the next Sink with highest priority shall be tried next for sending Events. +For example, a sink with priority 100 is activated before the Sink with priority +80. If no priority is specified, thr priority is determined based on the order in which +the Sinks are specified in configuration. + +To configure, set a sink groups processor to `failover` and set +priorities for all individual sinks. All specified priorities must +be unique. Furthermore, upper limit to failover time can be set +(in milliseconds) using `maxpenalty` property. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*sinks* |-- |Space-separated list of sinks that are participating in the group +|*processor.type* |`default` |The component type name, needs to be `failover` +|*processor.priority.++<++sinkName++>++* |-- |Priority value. ++<++sinkName++>++ must be one of the sink instances associated with the current sink group +A higher priority value Sink gets activated earlier. A larger absolute value indicates higher priority +|processor.maxpenalty |30000 |The maximum backoff period for the failed Sink (in millis) +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sinkgroups = g1 +a1.sinkgroups.g1.sinks = k1 k2 +a1.sinkgroups.g1.processor.type = failover +a1.sinkgroups.g1.processor.priority.k1 = 5 +a1.sinkgroups.g1.processor.priority.k2 = 10 +a1.sinkgroups.g1.processor.maxpenalty = 10000 +---- + +==== Load balancing Sink Processor + +Load balancing sink processor provides the ability to load-balance flow over +multiple sinks. It maintains an indexed list of active sinks on which the +load must be distributed. Implementation supports distributing load using +either via `round++_++robin` or `random` selection mechanisms. +The choice of selection mechanism defaults to `round++_++robin` type, +but can be overridden via configuration. Custom selection mechanisms are +supported via custom classes that inherits from `AbstractSinkSelector`. + +When invoked, this selector picks the next sink using its configured selection +mechanism and invokes it. For `round++_++robin` and `random` In case the selected sink +fails to deliver the event, the processor picks the next available sink via +its configured selection mechanism. This implementation does not blacklist +the failing sink and instead continues to optimistically attempt every +available sink. If all sinks invocations result in failure, the selector +propagates the failure to the sink runner. + +If `backoff` is enabled, the sink processor will blacklist +sinks that fail, removing them for selection for a given timeout. When the +timeout ends, if the sink is still unresponsive timeout is increased +exponentially to avoid potentially getting stuck in long waits on unresponsive +sinks. With this disabled, in round-robin all the failed sinks load will be +passed to the next sink in line and thus not evenly balanced + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*processor.sinks* |-- |Space-separated list of sinks that are participating in the group +|*processor.type* |`default` |The component type name, needs to be `load++_++balance` +|processor.backoff |false |Should failed sinks be backed off exponentially. +|processor.selector |`round++_++robin` |Selection mechanism. Must be either `round++_++robin`, `random` +or FQCN of custom class that inherits from `AbstractSinkSelector` +|processor.selector.maxTimeOut |30000 |Used by backoff selectors to limit exponential backoff (in milliseconds) +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sinkgroups = g1 +a1.sinkgroups.g1.sinks = k1 k2 +a1.sinkgroups.g1.processor.type = load_balance +a1.sinkgroups.g1.processor.backoff = true +a1.sinkgroups.g1.processor.selector = random +---- + +==== Custom Sink Processor + +Custom sink processors are not supported at the moment. + +=== Event Serializers + +The `file++_++roll` sink and the `hdfs` sink both support the +`EventSerializer` interface. Details of the EventSerializers that ship with +Flume are provided below. + +==== Body Text Serializer + +Alias: `text`. This interceptor writes the body of the event to an output +stream without any transformation or modification. The event headers are +ignored. Configuration options are as follows: + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|appendNewline |true |Whether a newline will be appended to each event at write time. The default +of true assumes that events do not contain newlines, for legacy reasons. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sinks = k1 +a1.sinks.k1.type = file_roll +a1.sinks.k1.channel = c1 +a1.sinks.k1.sink.directory = /var/log/flume +a1.sinks.k1.sink.serializer = text +a1.sinks.k1.sink.serializer.appendNewline = false +---- + +==== "Flume Event" Avro Event Serializer + +Alias: `avro++_++event`. + +This interceptor serializes Flume events into an Avro container file. The schema used is the same schema used for +Flume events in the Avro RPC mechanism. + +This serializer inherits from the `AbstractAvroEventSerializer` class. + +Configuration options are as follows: + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|syncIntervalBytes |2048000 |Avro sync interval, in approximate bytes. +|compressionCodec |null |Avro compression codec. For supported codecs, see Avro's CodecFactory docs. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sinks.k1.type = hdfs +a1.sinks.k1.channel = c1 +a1.sinks.k1.hdfs.path = /flume/events/%Y-%m-%d/%H%M/%S +a1.sinks.k1.serializer = avro_event +a1.sinks.k1.serializer.compressionCodec = snappy +---- + +==== Avro Event Serializer + +Alias: This serializer does not have an alias, and must be specified using the fully-qualified class name class name. + +This serializes Flume events into an Avro container file like the "Flume Event" Avro Event Serializer, however the +record schema is configurable. The record schema may be specified either as a Flume configuration property or passed in an event header. + +To pass the record schema as part of the Flume configuration, use the property `schemaURL` as listed below. + +To pass the record schema in an event header, specify either the event header `flume.avro.schema.literal` +containing a JSON-format representation of the schema or `flume.avro.schema.url` with a URL where +the schema may be found (`hdfs:/...` URIs are supported). + +This serializer inherits from the `AbstractAvroEventSerializer` class. + +Configuration options are as follows: + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|syncIntervalBytes |2048000 |Avro sync interval, in approximate bytes. +|compressionCodec |null |Avro compression codec. For supported codecs, see Avro's CodecFactory docs. +|schemaURL |null |Avro schema URL. Schemas specified in the header ovverride this option. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sinks.k1.type = hdfs +a1.sinks.k1.channel = c1 +a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S +a1.sinks.k1.serializer = org.apache.flume.sink.hdfs.AvroEventSerializer$Builder +a1.sinks.k1.serializer.compressionCodec = snappy +a1.sinks.k1.serializer.schemaURL = hdfs://namenode/path/to/schema.avsc +---- + +=== Flume Interceptors + +Flume has the capability to modify/drop events in-flight. This is done with the help of interceptors. Interceptors +are classes that implement `org.apache.flume.interceptor.Interceptor` interface. An interceptor can +modify or even drop events based on any criteria chosen by the developer of the interceptor. Flume supports +chaining of interceptors. This is made possible through by specifying the list of interceptor builder class names +in the configuration. Interceptors are specified as a whitespace separated list in the source configuration. +The order in which the interceptors are specified is the order in which they are invoked. +The list of events returned by one interceptor is passed to the next interceptor in the chain. Interceptors +can modify or drop events. If an interceptor needs to drop events, it just does not return that event in +the list that it returns. If it is to drop all events, then it simply returns an empty list. Interceptors +are named components, here is an example of how they are created through configuration: + +[source,properties] +---- +a1.sources = r1 +a1.sinks = k1 +a1.channels = c1 +a1.sources.r1.interceptors = i1 i2 +a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.HostInterceptor$Builder +a1.sources.r1.interceptors.i1.preserveExisting = false +a1.sources.r1.interceptors.i1.hostHeader = hostname +a1.sources.r1.interceptors.i2.type = org.apache.flume.interceptor.TimestampInterceptor$Builder +a1.sinks.k1.filePrefix = FlumeData.%{CollectorHost}.%Y-%m-%d +a1.sinks.k1.channel = c1 +---- + +Note that the interceptor builders are passed to the type config parameter. The interceptors are themselves +configurable and can be passed configuration values just like they are passed to any other configurable component. +In the above example, events are passed to the HostInterceptor first and the events returned by the HostInterceptor +are then passed along to the TimestampInterceptor. You can specify either the fully qualified class name (FQCN) +or the alias `timestamp`. If you have multiple collectors writing to the same HDFS path, then you could also use +the HostInterceptor. + +==== Timestamp Interceptor + +This interceptor inserts into the event headers, the time in millis at which it processes the event. This interceptor +inserts a header with key `timestamp` (or as specified by the `header` property) whose value is the relevant timestamp. +This interceptor can preserve an existing timestamp if it is already present in the configuration. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, has to be `timestamp` or the FQCN +|headerName |timestamp |The name of the header in which to place the generated timestamp. +|preserveExisting |false |If the timestamp already exists, should it be preserved - true or false +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.channels = c1 +a1.sources.r1.type = seq +a1.sources.r1.interceptors = i1 +a1.sources.r1.interceptors.i1.type = timestamp +---- + +==== Host Interceptor + +This interceptor inserts the hostname or IP address of the host that this agent is running on. It inserts a header +with key `host` or a configured key whose value is the hostname or IP address of the host, based on configuration. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, has to be `host` +|preserveExisting |false |If the host header already exists, should it be preserved - true or false +|useIP |true |Use the IP Address if true, else use hostname. +|hostHeader |host |The header key to be used. +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.interceptors = i1 +a1.sources.r1.interceptors.i1.type = host +---- + +==== Static Interceptor + +Static interceptor allows user to append a static header with static value to all events. + +The current implementation does not allow specifying multiple headers at one time. Instead user might chain +multiple static interceptors each defining one static header. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, has to be `static` +|preserveExisting |true |If configured header already exists, should it be preserved - true or false +|key |key |Name of header that should be created +|value |value |Static value that should be created +|=== + +Example for agent named a1: + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.sources.r1.channels = c1 +a1.sources.r1.type = seq +a1.sources.r1.interceptors = i1 +a1.sources.r1.interceptors.i1.type = static +a1.sources.r1.interceptors.i1.key = datacenter +a1.sources.r1.interceptors.i1.value = NEW_YORK +---- + +==== Remove Header Interceptor + +This interceptor manipulates Flume event headers, by removing one or many headers. It can remove a statically defined header, headers based on a regular expression or headers in a list. If none of these is defined, or if no header matches the criteria, the Flume events are not modified. + +Note that if only one header needs to be removed, specifying it by name provides performance benefits over the other 2 methods. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `remove++_++header` +|withName |-- |Name of the header to remove +|fromList |-- |List of headers to remove, separated with the separator specified by `fromListSeparator` +|fromListSeparator |++\++s++*++,++\++s++*++ |Regular expression used to separate multiple header names in the list specified by `fromList`. Default is a comma surrounded by any number of whitespace characters +|matching |-- |All the headers which names match this regular expression are removed +|=== + +==== UUID Interceptor + +This interceptor sets a universally unique identifier on all events that are intercepted. An example UUID is `b5755073-77a9-43c1-8fad-b7a586fc1b97`, which represents a 128-bit value. + +Consider using UUIDInterceptor to automatically assign a UUID to an event if no application level unique key for the event is available. It can be important to assign UUIDs to events as soon as they enter the Flume network; that is, in the first Flume Source of the flow. This enables subsequent deduplication of events in the face of replication and redelivery in a Flume network that is designed for high availability and high performance. If an application level key is available, this is preferable over an auto-generated UUID because it enables subsequent updates and deletes of event in data stores using said well known application level key. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder` +|headerName |id |The name of the Flume header to modify +|preserveExisting |true |If the UUID header already exists, should it be preserved - true or false +|prefix |"" |The prefix string constant to prepend to each generated UUID +|=== + +==== Morphline Interceptor + +This interceptor filters the events through a https://cloudera.github.io/cdk/docs/current/cdk-morphlines/index.html[morphline configuration file] that defines a chain of transformation commands that pipe records from one command to another. +For example the morphline can ignore certain events or alter or insert certain event headers via regular expression based pattern matching, or it can auto-detect and set a MIME type via Apache Tika on events that are intercepted. For example, this kind of packet sniffing can be used for content based dynamic routing in a Flume topology. +MorphlineInterceptor can also help to implement dynamic routing to multiple Apache Solr collections (e.g. for multi-tenancy). + +Currently, there is a restriction in that the morphline of an interceptor must not generate more than one output record for each input event. This interceptor is not intended for heavy duty ETL processing - if you need this consider moving ETL processing from the Flume Source to a Flume Sink, e.g. to a MorphlineSolrSink. + +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `org.apache.flume.sink.solr.morphline.MorphlineInterceptor$Builder` +|*morphlineFile* |-- |The relative or absolute path on the local file system to the morphline configuration file. Example: `/etc/flume-ng/conf/morphline.conf` +|morphlineId |null |Optional name used to identify a morphline if there are multiple morphlines in a morphline config file +|=== + +Sample flume.conf file: + +[source,properties] +---- +a1.sources.avroSrc.interceptors = morphlineinterceptor +a1.sources.avroSrc.interceptors.morphlineinterceptor.type = org.apache.flume.sink.solr.morphline.MorphlineInterceptor$Builder +a1.sources.avroSrc.interceptors.morphlineinterceptor.morphlineFile = /etc/flume-ng/conf/morphline.conf +a1.sources.avroSrc.interceptors.morphlineinterceptor.morphlineId = morphline1 +---- + +==== Search and Replace Interceptor + +This interceptor provides simple string-based search-and-replace functionality +based on Java regular expressions. Backtracking / group capture is also available. +This interceptor uses the same rules as in the Java Matcher.replaceAll() method. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `search++_++replace` +|searchPattern |-- |The pattern to search for and replace. +|replaceString |-- |The replacement string. +|charset |UTF-8 |The charset of the event body. Assumed by default to be UTF-8. +|=== + +Example configuration: + +[source,properties] +---- +a1.sources.avroSrc.interceptors = search-replace +a1.sources.avroSrc.interceptors.search-replace.type = search_replace + +# Remove leading alphanumeric characters in an event body. +a1.sources.avroSrc.interceptors.search-replace.searchPattern = ^[A-Za-z0-9_]+ +a1.sources.avroSrc.interceptors.search-replace.replaceString = +---- + +Another example: + +[source,properties] +---- +a1.sources.avroSrc.interceptors = search-replace +a1.sources.avroSrc.interceptors.search-replace.type = search_replace + +# Use grouping operators to reorder and munge words on a line. +a1.sources.avroSrc.interceptors.search-replace.searchPattern = The quick brown ([a-z]+) jumped over the lazy ([a-z]+) +a1.sources.avroSrc.interceptors.search-replace.replaceString = The hungry $2 ate the careless $1 +---- + +==== Regex Filtering Interceptor + +This interceptor filters events selectively by interpreting the event body as text and matching the text against a configured regular expression. +The supplied regular expression can be used to include events or exclude events. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `regex++_++filter` +|regex |".++*++" |Regular expression for matching against events +|excludeEvents |false |If true, regex determines events to exclude, otherwise regex determines +events to include. +|=== + +==== Regex Extractor Interceptor + +This interceptor extracts regex match groups using a specified regular expression and appends the match groups as headers on the event. +It also supports pluggable serializers for formatting the match groups before adding them as event headers. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `regex++_++extractor` +|*regex* |-- |Regular expression for matching against events +|*serializers* |-- |Space-separated list of serializers for mapping matches to header names and serializing their +values. (See example below) +Flume provides built-in support for the following serializers: +`org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer` +`org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer` +|serializers.++<++s1++>++.type |default |Must be `default` (org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer), +`org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer`, +or the FQCN of a custom class that implements `org.apache.flume.interceptor.RegexExtractorInterceptorSerializer` +|serializers.++<++s1++>++.*name* |-- | +|serializers.++*++ |-- |Serializer-specific properties +|=== + +The serializers are used to map the matches to a header name and a formatted header value; by default, you only need to specify +the header name and the default `org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer` will be used. +This serializer simply maps the matches to the specified header name and passes the value through as it was extracted by the regex. +You can plug custom serializer implementations into the extractor using the fully qualified class name (FQCN) to format the matches +in anyway you like. + +==== Example 1: + +If the Flume event body contained `1:2:3.4foobar5` and the following configuration was used + +[source,properties] +---- +a1.sources.r1.interceptors.i1.regex = (\\d):(\\d):(\\d) +a1.sources.r1.interceptors.i1.serializers = s1 s2 s3 +a1.sources.r1.interceptors.i1.serializers.s1.name = one +a1.sources.r1.interceptors.i1.serializers.s2.name = two +a1.sources.r1.interceptors.i1.serializers.s3.name = three +---- + +The extracted event will contain the same body but the following headers will have been added `one=++>++1, two=++>++2, three=++>++3` + +==== Example 2: + +If the Flume event body contained `2012-10-18 18:47:57,614 some log line` and the following configuration was used + +[source,properties] +---- +a1.sources.r1.interceptors.i1.regex = ^(?:\\n)?(\\d\\d\\d\\d-\\d\\d-\\d\\d\\s\\d\\d:\\d\\d) +a1.sources.r1.interceptors.i1.serializers = s1 +a1.sources.r1.interceptors.i1.serializers.s1.type = org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer +a1.sources.r1.interceptors.i1.serializers.s1.name = timestamp +a1.sources.r1.interceptors.i1.serializers.s1.pattern = yyyy-MM-dd HH:mm +---- + +the extracted event will contain the same body but the following headers will have been added `timestamp=++>++1350611220000` + +=== Flume Properties + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|flume.called.from.service |-- |If this property is specified then the Flume agent will continue +polling for the config file even if the config file is not found +at the expected location. Otherwise, the Flume agent will terminate +if the config doesn't exist at the expected location. No property +value is needed when setting this property (eg, just specifying +-Dflume.called.from.service is enough) +|=== + +==== Property: flume.called.from.service + +Flume periodically polls, every 30 seconds, for changes to the specified +config file. A Flume agent loads a new configuration from the config file if +either an existing file is polled for the first time, or if an existing +file's modification date has changed since the last time it was polled. +Renaming or moving a file does not change its modification time. When a +Flume agent polls a non-existent file then one of two things happens: 1. +When the agent polls a non-existent config file for the first time, then the +agent behaves according to the flume.called.from.service property. If the +property is set, then the agent will continue polling (always at the same +period -- every 30 seconds). If the property is not set, then the agent +immediately terminates. ...OR... 2. When the agent polls a non-existent +config file and this is not the first time the file is polled, then the +agent makes no config changes for this polling period. The agent continues +polling rather than terminating. + +== Configuration Filters + +Flume provides a tool for injecting sensitive or generated data into the configuration +in the form of configuration filters. A configuration key can be set as the value of configuration properties +and it will be replaced by the configuration filter with the value it represents. + +=== Common usage of config filters + +The format is similar to the Java Expression Language, however +it is currently not a fully working EL expression parser, just a format that looks like it. + +[source,properties] +---- +.configfilters = +.configfilters..type = + +.sources..parameter = ${['']} +.sinks..parameter = ${['']} +...parameter = ${['']} +#or +...parameter = ${[""]} +#or +...parameter = ${[]} +#or +...parameter = some_constant_data${[]} +---- + +=== Environment Variable Config Filter + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `env` +|=== + +==== Example + +To hide a password in the configuration set its value as in the following example. + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.configfilters = f1 + +a1.configfilters.f1.type = env + +a1.sources.r1.channels = c1 +a1.sources.r1.type = http +a1.sources.r1.keystorePassword = ${f1['my_keystore_password']} #will get the value Secret123 +---- + +Here the `a1.sources.r1.keystorePassword` configuration property will get the value of the `my++_++keystore++_++password` +environment variable. One way to set the environment variable is to run flume agent like this: + +`$ my++_++keystore++_++password=Secret123 bin/flume-ng agent --conf conf --conf-file example.conf ...` + +=== External Process Config Filter + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `external` +|*command* |-- |The command that will be executed to get the value for the given key. The command will be called like: `++<++command++>++ ++<++key++>++` And expected to return a single line value with exit code `0`. +|charset |UTF-8 |The characterset of the returned string. +|=== + +==== Example + +To hide a password in the configuration set its value as in the following example. + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.configfilters = f1 + +a1.configfilters.f1.type = external +a1.configfilters.f1.command = /usr/bin/passwordResolver.sh +a1.configfilters.f1.charset = UTF-8 + +a1.sources.r1.channels = c1 +a1.sources.r1.type = http +a1.sources.r1.keystorePassword = ${f1['my_keystore_password']} #will get the value Secret123 +---- + +In this example flume will run the following command to get the value + +`$ /usr/bin/passwordResolver.sh my++_++keystore++_++password` + +The `passwordResolver.sh` will return `Secret123` with an exit code `0`. + +==== Example 2 + +To generate a part of the directory for rolling file sink set its value as in the following example. + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.configfilters = f1 + +a1.configfilters.f1.type = external +a1.configfilters.f1.command = /usr/bin/generateUniqId.sh +a1.configfilters.f1.charset = UTF-8 + +a1.sinks = k1 +a1.sinks.k1.type = file_roll +a1.sinks.k1.channel = c1 +a1.sinks.k1.sink.directory = /var/log/flume/agent_${f1['agent_name']} # will be /var/log/flume/agent_1234 +---- + +In this example flume will run the following command to get the value + +`$ /usr/bin/generateUniqId.sh agent++_++name` + +The `generateUniqId.sh` will return `1234` with an exit code `0`. + +=== Hadoop Credential Store Config Filter + +A hadoop-common library needed on the classpath for this feature (2.6{plus} version). +If hadoop is installed the agent adds it to the classpath automatically + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name has to be `hadoop` +|*credential.provider.path* |-- |The provider path. See hadoop documentation [#here]#here#: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/CredentialProviderAPI.html#Configuring_the_Provider_Path +|credstore.java-keystore-provider.password-file |-- |The name of the password file if a file is used to store the password. The file must e on the classpath. +Provider password can be set with the HADOOP++_++CREDSTORE++_++PASSWORD environment variable or left empty. +|=== + +==== Example + +To hide a password in the configuration set its value as in the following example. + +[source,properties] +---- +a1.sources = r1 +a1.channels = c1 +a1.configfilters = f1 + +a1.configfilters.f1.type = hadoop +a1.configfilters.f1.credential.provider.path = jceks://file/ + +a1.sources.r1.channels = c1 +a1.sources.r1.type = http +a1.sources.r1.keystorePassword = ${f1['my_keystore_password']} #will get the value from the credential store +---- + +== Log4J Appender + +Appends Log4j events to a flume agent's avro source. A client using this +appender must have the flume-ng-sdk in the classpath (eg, +flume-ng-sdk-1.10.1.jar). +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*Hostname* |-- |The hostname on which a remote Flume agent is running with an +avro source. +|*Port* |-- |The port at which the remote Flume agent's avro source is +listening. +|UnsafeMode |false |If true, the appender will not throw exceptions on failure to +send the events. +|AvroReflectionEnabled |false |Use Avro Reflection to serialize Log4j events. (Do not use when users log strings) +|AvroSchemaUrl |-- |A URL from which the Avro schema can be retrieved. +|=== + +Sample log4j.properties file: + +[source,properties] +---- +#... +log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender +log4j.appender.flume.Hostname = example.com +log4j.appender.flume.Port = 41414 +log4j.appender.flume.UnsafeMode = true + +# configure a class's logger to output to the flume appender +log4j.logger.org.example.MyClass = DEBUG,flume +#... +---- + +By default each event is converted to a string by calling `toString()`, +or by using the Log4j layout, if specified. + +If the event is an instance of +`org.apache.avro.generic.GenericRecord`, `org.apache.avro.specific.SpecificRecord`, +or if the property `AvroReflectionEnabled` is set to `true` then the event will be +serialized using Avro serialization. + +Serializing every event with its Avro schema is inefficient, so it is good practice to +provide a schema URL from which the schema can be retrieved by the downstream sink, +typically the HDFS sink. If `AvroSchemaUrl` is not specified, +then the schema will be included as a Flume header. + +Sample log4j.properties file configured to use Avro serialization: + +[source,properties] +---- +#... +log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender +log4j.appender.flume.Hostname = example.com +log4j.appender.flume.Port = 41414 +log4j.appender.flume.AvroReflectionEnabled = true +log4j.appender.flume.AvroSchemaUrl = hdfs://namenode/path/to/schema.avsc + +# configure a class's logger to output to the flume appender +log4j.logger.org.example.MyClass = DEBUG,flume +#... +---- + +== Load Balancing Log4J Appender + +Appends Log4j events to a list of flume agent's avro source. A client using this +appender must have the flume-ng-sdk in the classpath (eg, +flume-ng-sdk-1.10.1.jar). This appender supports a round-robin and random +scheme for performing the load balancing. It also supports a configurable backoff +timeout so that down agents are removed temporarily from the set of hosts +Required properties are in *bold*. + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*Hosts* |-- |A space-separated list of host:port at which Flume (through +an AvroSource) is listening for events +|Selector |ROUND++_++ROBIN |Selection mechanism. Must be either ROUND++_++ROBIN, +RANDOM or custom FQDN to class that inherits from +LoadBalancingSelector. +|MaxBackoff |-- |A long value representing the maximum amount of time in +milliseconds the Load balancing client will backoff from a +node that has failed to consume an event. Defaults to no backoff +|UnsafeMode |false |If true, the appender will not throw exceptions on failure to +send the events. +|AvroReflectionEnabled |false |Use Avro Reflection to serialize Log4j events. +|AvroSchemaUrl |-- |A URL from which the Avro schema can be retrieved. +|=== + +Sample log4j.properties file configured using defaults: + +[source,properties] +---- +#... +log4j.appender.out2 = org.apache.flume.clients.log4jappender.LoadBalancingLog4jAppender +log4j.appender.out2.Hosts = localhost:25430 localhost:25431 + +# configure a class's logger to output to the flume appender +log4j.logger.org.example.MyClass = DEBUG,flume +#... +---- + +Sample log4j.properties file configured using RANDOM load balancing: + +[source,properties] +---- +#... +log4j.appender.out2 = org.apache.flume.clients.log4jappender.LoadBalancingLog4jAppender +log4j.appender.out2.Hosts = localhost:25430 localhost:25431 +log4j.appender.out2.Selector = RANDOM + +# configure a class's logger to output to the flume appender +log4j.logger.org.example.MyClass = DEBUG,flume +#... +---- + +Sample log4j.properties file configured using backoff: + +[source,properties] +---- +#... +log4j.appender.out2 = org.apache.flume.clients.log4jappender.LoadBalancingLog4jAppender +log4j.appender.out2.Hosts = localhost:25430 localhost:25431 localhost:25432 +log4j.appender.out2.Selector = ROUND_ROBIN +log4j.appender.out2.MaxBackoff = 30000 + +# configure a class's logger to output to the flume appender +log4j.logger.org.example.MyClass = DEBUG,flume +#... +---- + +== Security + +The HDFS sink, HBase sink, Thrift source, Thrift sink and Kite Dataset sink all support +Kerberos authentication. Please refer to the corresponding sections for +configuring the Kerberos-related options. + +Flume agent will authenticate to the kerberos KDC as a single principal, which will be +used by different components that require kerberos authentication. The principal and +keytab configured for Thrift source, Thrift sink, HDFS sink, HBase sink and DataSet sink +should be the same, otherwise the component will fail to start. + +== Monitoring + +Monitoring in Flume is still a work in progress. Changes can happen very often. +Several Flume components report metrics to the JMX platform MBean server. These +metrics can be queried using Jconsole. + +=== Available Component Metrics + +The following tables show what metrics are available for components. Each component only maintains a +set of metrics, indicated by an 'x', the unmaintained ones show default values, that is 0. +These tables tell you where you can expect meaningful data. +The name of the metrics should be descriptive enough, for more information you have to dig into the +source code of the components. + +==== Sources 1 + +[width="93%",cols="34%,7%,7%,7%,6%,8%,22%,9%",] +|=== +| |Avro |Exec |HTTP |JMS |Kafka |MultiportSyslogTCP |Scribe +|AppendAcceptedCount |x | | | | | | +|AppendBatchAcceptedCount |x | |x |x | | | +|AppendBatchReceivedCount |x | |x |x | | | +|AppendReceivedCount |x | | | | | | +|ChannelWriteFail |x | |x |x |x |x |x +|EventAcceptedCount |x |x |x |x |x |x |x +|EventReadFail | | |x |x |x |x |x +|EventReceivedCount |x |x |x |x |x |x |x +|GenericProcessingFail | | |x | | |x | +|KafkaCommitTimer | | | | |x | | +|KafkaEmptyCount | | | | |x | | +|KafkaEventGetTimer | | | | |x | | +|OpenConnectionCount |x | | | | | | +|=== + +==== Sources 2 + +[width="95%",cols="28%,18%,15%,11%,11%,9%,8%",] +|=== +| |SequenceGenerator |SpoolDirectory |SyslogTcp |SyslogUDP |Taildir |Thrift +|AppendAcceptedCount | | | | | |x +|AppendBatchAcceptedCount |x |x | | |x |x +|AppendBatchReceivedCount | |x | | |x |x +|AppendReceivedCount | | | | | |x +|ChannelWriteFail |x |x |x |x |x |x +|EventAcceptedCount |x |x |x |x |x |x +|EventReadFail | |x |x |x |x | +|EventReceivedCount | |x |x |x |x |x +|GenericProcessingFail | |x | | |x | +|KafkaCommitTimer | | | | | | +|KafkaEmptyCount | | | | | | +|KafkaEventGetTimer | | | | | | +|OpenConnectionCount | | | | | | +|=== + +==== Sinks 1 + +[width="95%",cols="38%,20%,18%,11%,13%",] +|=== +| |Avro/Thrift |AsyncHBase |HBase |HBase2 +|BatchCompleteCount |x |x |x |x +|BatchEmptyCount |x |x |x |x +|BatchUnderflowCount |x |x |x |x +|ChannelReadFail |x | | |x +|ConnectionClosedCount |x |x |x |x +|ConnectionCreatedCount |x |x |x |x +|ConnectionFailedCount |x |x |x |x +|EventDrainAttemptCount |x |x |x |x +|EventDrainSuccessCount |x |x |x |x +|EventWriteFail |x | | |x +|KafkaEventSendTimer | | | | +|RollbackCount | | | | +|=== + +==== Sinks 2 + +[width="94%",cols="31%,14%,8%,8%,9%,14%,16%",] +|=== +| |HDFSEvent |Hive |Http |Kafka |Morphline |RollingFile +|BatchCompleteCount |x |x | | |x | +|BatchEmptyCount |x |x | |x |x | +|BatchUnderflowCount |x |x | |x |x | +|ChannelReadFail |x |x |x |x |x |x +|ConnectionClosedCount |x |x | | | |x +|ConnectionCreatedCount |x |x | | | |x +|ConnectionFailedCount |x |x | | | |x +|EventDrainAttemptCount |x |x |x | |x |x +|EventDrainSuccessCount |x |x |x |x |x |x +|EventWriteFail |x |x |x |x |x |x +|KafkaEventSendTimer | | | |x | | +|RollbackCount | | | |x | | +|=== + +==== Channels + +[width="95%",cols="38%,7%,8%,9%,19%,19%",] +|=== +| |File |Kafka |Memory |PseudoTxnMemory |SpillableMemory +|ChannelCapacity |x | |x | |x +|ChannelSize |x | |x |x |x +|CheckpointBackupWriteErrorCount |x | | | | +|CheckpointWriteErrorCount |x | | | | +|EventPutAttemptCount |x |x |x |x |x +|EventPutErrorCount |x | | | | +|EventPutSuccessCount |x |x |x |x |x +|EventTakeAttemptCount |x |x |x |x |x +|EventTakeErrorCount |x | | | | +|EventTakeSuccessCount |x |x |x |x |x +|KafkaCommitTimer | |x | | | +|KafkaEventGetTimer | |x | | | +|KafkaEventSendTimer | |x | | | +|Open |x | | | | +|RollbackCounter | |x | | | +|Unhealthy |x | | | | +|=== + +=== JMX Reporting + +JMX Reporting can be enabled by specifying JMX parameters in the JAVA++_++OPTS environment variable using +flume-env.sh, like + +____ +export JAVA++_++OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=5445 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" +____ + +NOTE: The sample above disables the security. To enable Security, please refer https://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html + +=== Ganglia Reporting + +Flume can also report these metrics to +Ganglia 3 or Ganglia 3.1 metanodes. To report metrics to Ganglia, a flume agent +must be started with this support. The Flume agent has to be started by passing +in the following parameters as system properties prefixed by `flume.monitoring.`, +and can be specified in the flume-env.sh: + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, has to be `ganglia` +|*hosts* |-- |Comma-separated list of `hostname:port` of Ganglia servers +|pollFrequency |60 |Time, in seconds, between consecutive reporting to Ganglia server +|isGanglia3 |false |Ganglia server version is 3. By default, Flume sends in Ganglia 3.1 format +|=== + +We can start Flume with Ganglia support as follows: + +.... +$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=ganglia -Dflume.monitoring.hosts=com.example:1234,com.example2:5455 +.... + +=== JSON Reporting + +Flume can also report metrics in a JSON format. To enable reporting in JSON format, Flume hosts +a Web server on a configurable port. Flume reports metrics in the following JSON format: + +[source,java] +---- +{ +"typeName1.componentName1" : {"metric1" : "metricValue1", "metric2" : "metricValue2"}, +"typeName2.componentName2" : {"metric3" : "metricValue3", "metric4" : "metricValue4"} +} +---- + +Here is an example: + +[source,java] +---- +{ +"CHANNEL.fileChannel":{"EventPutSuccessCount":"468085", + "Type":"CHANNEL", + "StopTime":"0", + "EventPutAttemptCount":"468086", + "ChannelSize":"233428", + "StartTime":"1344882233070", + "EventTakeSuccessCount":"458200", + "ChannelCapacity":"600000", + "EventTakeAttemptCount":"458288"}, +"CHANNEL.memChannel":{"EventPutSuccessCount":"22948908", + "Type":"CHANNEL", + "StopTime":"0", + "EventPutAttemptCount":"22948908", + "ChannelSize":"5", + "StartTime":"1344882209413", + "EventTakeSuccessCount":"22948900", + "ChannelCapacity":"100", + "EventTakeAttemptCount":"22948908"} +} +---- + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, has to be `http` +|port |41414 |The port to start the server on. +|=== + +We can start Flume with JSON Reporting support as follows: + +.... +$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=http -Dflume.monitoring.port=34545 +.... + +Metrics will then be available at *http://++<++hostname++>++:++<++port++>++/metrics* webpage. +Custom components can report metrics as mentioned in the Ganglia section above. + +=== Custom Reporting + +It is possible to report metrics to other systems by writing servers that do +the reporting. Any reporting class has to implement the interface, +`org.apache.flume.instrumentation.MonitorService`. Such a class can be used +the same way the GangliaServer is used for reporting. They can poll the platform +mbean server to poll the mbeans for metrics. For example, if an HTTP +monitoring service called `HTTPReporting` can be used as follows: + +.... +$ bin/flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=com.example.reporting.HTTPReporting -Dflume.monitoring.node=com.example:332 +.... + +[cols=",,",options="header",] +|=== +|Property Name |Default |Description +|*type* |-- |The component type name, has to be FQCN +|=== + +=== Reporting metrics from custom components + +Any custom flume components should inherit from the +`org.apache.flume.instrumentation.MonitoredCounterGroup` class. The class +should then provide getter methods for each of the metrics it exposes. See +the code below. The MonitoredCounterGroup expects a list of attributes whose +metrics are exposed by this class. As of now, this class only supports exposing +metrics as long values. + +[source,java] +---- +public class SinkCounter extends MonitoredCounterGroup implements + SinkCounterMBean { + + private static final String COUNTER_CONNECTION_CREATED = + "sink.connection.creation.count"; + + private static final String COUNTER_CONNECTION_CLOSED = + "sink.connection.closed.count"; + + private static final String COUNTER_CONNECTION_FAILED = + "sink.connection.failed.count"; + + private static final String COUNTER_BATCH_EMPTY = + "sink.batch.empty"; + + private static final String COUNTER_BATCH_UNDERFLOW = + "sink.batch.underflow"; + + private static final String COUNTER_BATCH_COMPLETE = + "sink.batch.complete"; + + private static final String COUNTER_EVENT_DRAIN_ATTEMPT = + "sink.event.drain.attempt"; + + private static final String COUNTER_EVENT_DRAIN_SUCCESS = + "sink.event.drain.sucess"; + + private static final String[] ATTRIBUTES = { + COUNTER_CONNECTION_CREATED, COUNTER_CONNECTION_CLOSED, + COUNTER_CONNECTION_FAILED, COUNTER_BATCH_EMPTY, + COUNTER_BATCH_UNDERFLOW, COUNTER_BATCH_COMPLETE, + COUNTER_EVENT_DRAIN_ATTEMPT, COUNTER_EVENT_DRAIN_SUCCESS + }; + + + public SinkCounter(String name) { + super(MonitoredCounterGroup.Type.SINK, name, ATTRIBUTES); + } + + @Override + public long getConnectionCreatedCount() { + return get(COUNTER_CONNECTION_CREATED); + } + + public long incrementConnectionCreatedCount() { + return increment(COUNTER_CONNECTION_CREATED); + } + +} +---- + +== Tools + +=== File Channel Integrity Tool + +File Channel Integrity tool verifies the integrity of individual Events in the File channel +and removes corrupted Events. + +The tools can be run as follows: + +.... +$bin/flume-ng tool --conf ./conf FCINTEGRITYTOOL -l ./datadir +.... + +where datadir is the comma separated list of data directory to be verified. + +Following are the options available + +[cols=",",options="header",] +|=== +|Option Name |Description +|h/help |Displays help +|*l/dataDirs* |Comma-separated list of data directories which the tool must verify +|=== + +=== Event Validator Tool + +Event validator tool can be used to validate the File Channel Event's in application specific way. +The tool applies the user provider validation login on each event and drop the event which do not +confirm to the logic. + +The tools can be run as follows: + +.... +$bin/flume-ng tool --conf ./conf FCINTEGRITYTOOL -l ./datadir -e org.apache.flume.MyEventValidator -DmaxSize 2000 +.... + +where datadir is the comma separated list of data directory to be verified. + +Following are the options available + +[cols=",",options="header",] +|=== +|Option Name |Description +|h/help |Displays help +|*l/dataDirs* |Comma-separated list of data directories which the tool must verify +|e/eventValidator |Fully Qualified Name of Event Validator Implementation. The jar must +be on Flume classpath +|=== + +The Event validator implementation must implement EventValidator interface. It's recommended +not to throw any exception from the implementation as they are treated as invalid events. +Additional parameters can be passed to EventValitor implementation via -D options. + +Let's see an example of simple size based Event Validator, which shall reject event's larger +than maximum size specified. + +[source,java] +---- +public static class MyEventValidator implements EventValidator { + + private int value = 0; + + private MyEventValidator(int val) { + value = val; + } + + @Override + public boolean validateEvent(Event event) { + return event.getBody() <= value; + } + + public static class Builder implements EventValidator.Builder { + + private int sizeValidator = 0; + + @Override + public EventValidator build() { + return new DummyEventVerifier(sizeValidator); + } + + @Override + public void configure(Context context) { + binaryValidator = context.getInteger("maxSize"); + } + } +} +---- + +== Topology Design Considerations + +Flume is very flexible and allows a large range of possible deployment +scenarios. If you plan to use Flume in a large, production deployment, it is +prudent to spend some time thinking about how to express your problem in +terms of a Flume topology. This section covers a few considerations. + +=== Is Flume a good fit for your problem? + +If you need to ingest textual log data into Hadoop/HDFS then Flume is the +right fit for your problem, full stop. For other use cases, here are some +guidelines: + +Flume is designed to transport and ingest regularly-generated event data over +relatively stable, potentially complex topologies. The notion of "event data" +is very broadly defined. To Flume, an event is just a generic blob of bytes. +There are some limitations on how large an event can be - for instance, it +cannot be larger than what you can store in memory or on disk on a single machine - +but in practice, flume events can be everything from textual log entries to +image files. The key property of an event is that they are generated in a +continuous, streaming fashion. If your data is not regularly generated +(i.e. you are trying to do a single bulk load of data into a Hadoop cluster) +then Flume will still work, but it is probably overkill for your situation. +Flume likes relatively stable topologies. Your topologies do not need to be +immutable, because Flume can deal with changes in topology without losing data +and can also tolerate periodic reconfiguration due to fail-over or +provisioning. It probably won't work well if you plant to change topologies +every day, because reconfiguration takes some thought and overhead. + +=== Flow reliability in Flume + +The reliability of a Flume flow depends on several factors. By adjusting these +factors, you can achieve a wide array of reliability options with Flume. + +*What type of channel you use.* Flume has both durable channels (those which +will persist data to disk) and non durable channels (those which will lose +data if a machine fails). Durable channels use disk-based storage, and data +stored in such channels will persist across machine restarts or non +disk-related failures. + +*Whether your channels are sufficiently provisioned for the workload.* Channels +in Flume act as buffers at various hops. These buffers have a fixed capacity, +and once that capacity is full you will create back pressure on earlier points +in the flow. If this pressure propagates to the source of the flow, Flume will +become unavailable and may lose data. + +*Whether you use redundant topologies.* Flume let's you replicate flows +across redundant topologies. This can provide a very easy source of fault +tolerance and one which is overcomes both disk or machine failures.  + +_The best way to think about reliability in a Flume topology is to consider +various failure scenarios and their outcomes._ What happens if a disk fails? +What happens if a machine fails? What happens if your terminal sink +(e.g. HDFS) goes down for some time and you have back pressure? The space of +possible designs is huge, but the underlying questions you need to ask are +just a handful. + +=== Flume topology design + +The first step in designing a Flume topology is to enumerate all sources +and destinations (terminal sinks) for your data. These will define the edge +points of your topology. The next consideration is whether to introduce +intermediate aggregation tiers or event routing. If you are collecting data +form a large number of sources, it can be helpful to aggregate the data in +order to simplify ingestion at the terminal sink. An aggregation tier can +also smooth out burstiness from sources or unavailability at sinks, by +acting as a buffer. If you are routing data between different locations, +you may also want to split flows at various points: this creates +sub-topologies which may themselves include aggregation points. + +=== Sizing a Flume deployment + +Once you have an idea of what your topology will look like, the next question +is how much hardware and networking capacity is needed. This starts by +quantifying how much data you generate. That is not always +a simple task! Most data streams are bursty (for instance, due to diurnal +patterns) and potentially unpredictable. A good starting point is to think +about the maximum throughput you'll have in each tier of the topology, both +in terms of _events per second_ and _bytes per second_. Once you know the +required throughput of a given tier, you can calulate a lower bound on how many +nodes you require for that tier. To determine attainable throughput, it's +best to experiment with Flume on your hardware, using synthetic or sampled +event data. In general, disk-based channels +should get 10's of MB/s and memory based channels should get 100's of MB/s or +more. Performance will vary widely, however depending on hardware and +operating environment. + +Sizing aggregate throughput gives you a lower bound on the number of nodes +you will need to each tier. There are several reasons to have additional +nodes, such as increased redundancy and better ability to absorb bursts in load. + +== Troubleshooting + +=== Handling agent failures + +If the Flume agent goes down, then the all the flows hosted on that agent are +aborted. Once the agent is restarted, then flow will resume. The flow using +file channel or other stable channel will resume processing events where it left +off. If the agent can't be restarted on the same hardware, then there is an option to +migrate the database to another hardware and setup a new Flume agent that +can resume processing the events saved in the db. The database HA futures +can be leveraged to move the Flume agent to another host. + +=== Compatibility + +==== HDFS + +Currently Flume supports HDFS 0.20.2 and 0.23. + +==== AVRO + +TBD + +==== Additional version requirements + +TBD + +=== Tracing + +TBD + +=== More Sample Configs + +TBD + +== Component Summary + +[cols=",,",options="header",] +|=== +|Component Interface |Type Alias |Implementation Class +|org.apache.flume.Channel |memory |org.apache.flume.channel.MemoryChannel +|org.apache.flume.Channel |jdbc |org.apache.flume.channel.jdbc.JdbcChannel +|org.apache.flume.Channel |file |org.apache.flume.channel.file.FileChannel +|org.apache.flume.Channel |-- |org.apache.flume.channel.PseudoTxnMemoryChannel +|org.apache.flume.Channel |-- |org.example.MyChannel +|org.apache.flume.Source |avro |org.apache.flume.source.AvroSource +|org.apache.flume.Source |netcat |org.apache.flume.source.NetcatSource +|org.apache.flume.Source |seq |org.apache.flume.source.SequenceGeneratorSource +|org.apache.flume.Source |exec |org.apache.flume.source.ExecSource +|org.apache.flume.Source |syslogtcp |org.apache.flume.source.SyslogTcpSource +|org.apache.flume.Source |multiport++_++syslogtcp |org.apache.flume.source.MultiportSyslogTCPSource +|org.apache.flume.Source |syslogudp |org.apache.flume.source.SyslogUDPSource +|org.apache.flume.Source |spooldir |org.apache.flume.source.SpoolDirectorySource +|org.apache.flume.Source |http |org.apache.flume.source.http.HTTPSource +|org.apache.flume.Source |thrift |org.apache.flume.source.ThriftSource +|org.apache.flume.Source |jms |org.apache.flume.source.jms.JMSSource +|org.apache.flume.Source |-- |org.apache.flume.source.avroLegacy.AvroLegacySource +|org.apache.flume.Source |-- |org.apache.flume.source.thriftLegacy.ThriftLegacySource +|org.apache.flume.Source |-- |org.example.MySource +|org.apache.flume.Sink |null |org.apache.flume.sink.NullSink +|org.apache.flume.Sink |logger |org.apache.flume.sink.LoggerSink +|org.apache.flume.Sink |avro |org.apache.flume.sink.AvroSink +|org.apache.flume.Sink |hdfs |org.apache.flume.sink.hdfs.HDFSEventSink +|org.apache.flume.Sink |hbase |org.apache.flume.sink.hbase.HBaseSink +|org.apache.flume.Sink |hbase2 |org.apache.flume.sink.hbase2.HBase2Sink +|org.apache.flume.Sink |asynchbase |org.apache.flume.sink.hbase.AsyncHBaseSink +|org.apache.flume.Sink |file++_++roll |org.apache.flume.sink.RollingFileSink +|org.apache.flume.Sink |irc |org.apache.flume.sink.irc.IRCSink +|org.apache.flume.Sink |thrift |org.apache.flume.sink.ThriftSink +|org.apache.flume.Sink |-- |org.example.MySink +|org.apache.flume.ChannelSelector |replicating |org.apache.flume.channel.ReplicatingChannelSelector +|org.apache.flume.ChannelSelector |multiplexing |org.apache.flume.channel.MultiplexingChannelSelector +|org.apache.flume.ChannelSelector |-- |org.example.MyChannelSelector +|org.apache.flume.SinkProcessor |default |org.apache.flume.sink.DefaultSinkProcessor +|org.apache.flume.SinkProcessor |failover |org.apache.flume.sink.FailoverSinkProcessor +|org.apache.flume.SinkProcessor |load++_++balance |org.apache.flume.sink.LoadBalancingSinkProcessor +|org.apache.flume.SinkProcessor |-- | +|org.apache.flume.interceptor.Interceptor |timestamp |org.apache.flume.interceptor.TimestampInterceptor$Builder +|org.apache.flume.interceptor.Interceptor |host |org.apache.flume.interceptor.HostInterceptor$Builder +|org.apache.flume.interceptor.Interceptor |static |org.apache.flume.interceptor.StaticInterceptor$Builder +|org.apache.flume.interceptor.Interceptor |regex++_++filter |org.apache.flume.interceptor.RegexFilteringInterceptor$Builder +|org.apache.flume.interceptor.Interceptor |regex++_++extractor |org.apache.flume.interceptor.RegexFilteringInterceptor$Builder +|org.apache.flume.channel.file.encryption.KeyProvider$Builder |jceksfile |org.apache.flume.channel.file.encryption.JCEFileKeyProvider +|org.apache.flume.channel.file.encryption.KeyProvider$Builder |-- |org.example.MyKeyProvider +|org.apache.flume.channel.file.encryption.CipherProvider |aesctrnopadding |org.apache.flume.channel.file.encryption.AESCTRNoPaddingProvider +|org.apache.flume.channel.file.encryption.CipherProvider |-- |org.example.MyCipherProvider +|org.apache.flume.serialization.EventSerializer$Builder |text |org.apache.flume.serialization.BodyTextEventSerializer$Builder +|org.apache.flume.serialization.EventSerializer$Builder |avro++_++event |org.apache.flume.serialization.FlumeEventAvroEventSerializer$Builder +|org.apache.flume.serialization.EventSerializer$Builder |-- |org.example.MyEventSerializer$Builder +|=== + +== Alias Conventions + +These conventions for alias names are used in the component-specific examples above, to keep the names short and consistent across all examples. + +[cols=",",options="header",] +|=== +|Alias Name |Alias Type +|a |**a**gent +|c |**c**hannel +|r |sou**r**ce +|k |sin**k** +|g |sink **g**roup +|i |**i**nterceptor +|y |ke**y** +|h |**h**ost +|s |**s**erializer +|=== diff --git a/src/site/antora/modules/ROOT/pages/documentation.adoc b/src/site/antora/modules/ROOT/pages/documentation.adoc new file mode 100644 index 0000000000..549cadd737 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/documentation.adoc @@ -0,0 +1,34 @@ +//// + 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. +//// + += Documentation + +The latest released version: + +* link:releases/content/1.11.0/FlumeUserGuide.html[Flume User Guide] +* link:releases/content/1.11.0/FlumeDeveloperGuide.html[Flume Developer Guide] + +The documents below are the very most recent versions of the documentation and may contain features that have not +been released. + +* (unreleased version on github) +* (unreleased version on github) + +For documentation on released versions of Flume, please see the link:releases/[Releases] page. + +FlumeUserGuide +FlumeDeveloperGuide diff --git a/src/site/antora/modules/ROOT/pages/download.adoc b/src/site/antora/modules/ROOT/pages/download.adoc new file mode 100644 index 0000000000..f67837b71d --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/download.adoc @@ -0,0 +1,53 @@ +//// + 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. +//// + += Download + +Apache Flume is distributed under the https://www.apache.org/licenses/LICENSE-2.0.html[Apache License, version 2.0] + +The link in the Mirrors column should display a list of available mirrors with a default selection based on your +inferred location. If you do not see that page, try a different browser. The checksum and signature are links to the +originals on the main distribution server. + +[cols=",,,",] +|=== +|Apache Flume binary (tar.gz) |https://www.apache.org/dyn/closer.lua/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz[apache-flume-1.11.0-bin.tar.gz] |https://www.apache.org/dist/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz.sha512[apache-flume-1.11.0-bin.tar.gz.sha512] |https://www.apache.org/dist/flume/1.11.0/apache-flume-1.11.0-bin.tar.gz.asc[apache-flume-1.11.0-bin.tar.gz.asc] +|Apache Flume source (tar.gz) |https://www.apache.org/dyn/closer.lua/flume/1.11.0/apache-flume-1.11.0-src.tar.gz[apache-flume-1.11.0-src.tar.gz] |https://www.apache.org/dist/flume/1.11.0/apache-flume-1.11.0-src.tar.gz.sha512[apache-flume-1.11.0-src.tar.gz.sha512] |https://www.apache.org/dist/flume/1.11.0/apache-flume-1.11.0-src.tar.gz.asc[apache-flume-1.11.0-src.tar.gz.asc] +|=== + +It is essential that you verify the integrity of the downloaded files using the PGP or SHA512 signatures. Please read +https://httpd.apache.org/dev/verification.html[Verifying Apache HTTP Server Releases] for more information on +why you should verify our releases. + +The PGP signatures can be verified using PGP or GPG. First download the https://www.apache.org/dist/flume/KEYS[KEYS] +as well as the asc signature file for the relevant distribution. Make sure you get these files from the +https://www.apache.org/dist/flume/[main distribution directory] rather than from a mirror. +Then verify the signatures using: + +.... +% gpg --import KEYS +% gpg --verify apache-flume-1.11.0-src.tar.gz.asc +.... + +Apache Flume 1.11.0 is signed by Ralph Goers B3D8E1BA + +In addition, you can verify the SHA512 checksum on the files. A Unix program called sha or sha512sum is included in +many Unix distributions. Note that verifying the checksum is unnecessary if the PGP signature has been validated. + +*Previous++_++Releases* + +All previous releases of Apache Flume can be found in the https://archive.apache.org/dist/flume[archive repository]. diff --git a/src/site/antora/modules/ROOT/pages/flume-spring-boot/download.adoc b/src/site/antora/modules/ROOT/pages/flume-spring-boot/download.adoc new file mode 100644 index 0000000000..d4247ede80 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/flume-spring-boot/download.adoc @@ -0,0 +1,53 @@ +//// + 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. +//// + += Downloading Apache Flume Spring Boot + +Apache Flume Spring Boot is distributed under the https://www.apache.org/licenses/LICENSE-2.0.html[Apache License, version 2.0] + +The link in the Mirrors column should display a list of available mirrors with a default selection based on your +inferred location. If you do not see that page, try a different browser. The checksum and signature are links to the +originals on the main distribution server. + +[cols=",,,",] +|=== +|Apache Flume Spring Boot binary (tar.gz) |https://www.apache.org/dyn/closer.lua/flume/flume-spring-boot/apache-flume-spring-boot-2.0.0-bin.tar.gz[apache-flume-spring-boot-2.0.0-bin.tar.gz] |https://www.apache.org/dist/flume/flume-spring-boot/apache-flume-spring-boot-2.0.0-bin.tar.gz.sha512[apache-flume-spring-boot-2.0.0-bin.tar.gz.sha512] |https://www.apache.org/dist/flume/flume-spring-boot/apache-flume-spring-boot-2.0.0-bin.tar.gz.asc[apache-flume-spring-boot-2.0.0-bin.tar.gz.asc] +|Apache Flume Spring Boot source (tar.gz) |https://www.apache.org/dyn/closer.lua/flume/flume-spring-boot/apache-flume-spring-boot-2.0.0-src.tar.gz[apache-flume-spring-boot-2.0.0-src.tar.gz] |https://www.apache.org/dist/flume/flume-spring-boot/apache-flume-spring-boot-2.0.0-src.tar.gz.sha512[apache-flume-spring-boot-2.0.0-src.tar.gz.sha512] |https://www.apache.org/dist/flume/flume-spring-boot/apache-flume-spring-boot-2.0.0-src.tar.gz.asc[apache-flume-spring-boot-2.0.0-src.tar.gz.asc] +|=== + +It is essential that you verify the integrity of the downloaded files using the PGP or SHA512 signatures. Please read +https://httpd.apache.org/dev/verification.html[Verifying Apache HTTP Server Releases] for more information on +why you should verify our releases. + +The PGP signatures can be verified using PGP or GPG. First download the https://www.apache.org/dist/flume/KEYS[KEYS] +as well as the asc signature file for the relevant distribution. Make sure you get these files from the +https://www.apache.org/dist/flume/flume-spring-boot/[main distribution directory] rather than from a mirror. +Then verify the signatures using: + +.... +% gpg --import KEYS +% gpg --verify apache-flume-spring-boot-2.0.0-src.tar.gz.asc +.... + +Apache Flume Spring Boot 2.0.0 is signed by Ralph Goers B3D8E1BA + +In addition, you can verify the SHA512 checksum on the files. A Unix program called sha or sha512sum is included in +many Unix distributions. Note that verifying the checksum is unnecessary if the PGP signature has been validated. + +*Previous++_++Releases* + +All previous releases of Apache Flume can be found in the https://archive.apache.org/dist/flume/flume-spring-boot[archive repository]. diff --git a/src/site/antora/modules/ROOT/pages/flume-spring-boot/index.adoc b/src/site/antora/modules/ROOT/pages/flume-spring-boot/index.adoc new file mode 100644 index 0000000000..d6b9ec44cc --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/flume-spring-boot/index.adoc @@ -0,0 +1,25 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Apache Flume Spring Boot + +The Apache Flume Spring Boot module provides the minimal framework required to allow +Apache Flume to be created and configured as a "normal" Spring Boot applications. + +download +releases/index +source diff --git a/src/site/antora/modules/ROOT/pages/flume-spring-boot/releases/2.0.0.adoc b/src/site/antora/modules/ROOT/pages/flume-spring-boot/releases/2.0.0.adoc new file mode 100644 index 0000000000..215d3a7ca4 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/flume-spring-boot/releases/2.0.0.adoc @@ -0,0 +1,29 @@ +//// + 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. +//// + += Flume Spring Boot 2.0.0 + +*Status of this release* + +This release is the first release of Apache Flume Spring Boot as a standalone project. + +*Changes* + +* {blank} ++ +Bugs:: + ** ++[#++1++]++ - Require Applications to define a configuration class containing the appropriate ComponentScan declaration in spring.factories. diff --git a/src/site/antora/modules/ROOT/pages/flume-spring-boot/releases/index.adoc b/src/site/antora/modules/ROOT/pages/flume-spring-boot/releases/index.adoc new file mode 100644 index 0000000000..3343b3fed3 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/flume-spring-boot/releases/index.adoc @@ -0,0 +1,26 @@ +//// + 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. +//// + += Flume Spring Boot Releases + +*Current Release* + +The current stable release is xref:flume-spring-boot/releases/2.0.0.adoc[Apache Flume Sprinb Boot Version 2.0.0]. + +2.0.0 + +*Previous Releases* diff --git a/src/site/antora/modules/ROOT/pages/flume-spring-boot/source.adoc b/src/site/antora/modules/ROOT/pages/flume-spring-boot/source.adoc new file mode 100644 index 0000000000..dece89324e --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/flume-spring-boot/source.adoc @@ -0,0 +1,84 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Apache Flume Spring Boot Source Repository + +*Overview* + +This project uses http://git-scm.com/[Git] to manage its source code. Instructions on +Git use can be found in the http://git-scm.com/documentation/[Git documentation]. + +*Web Access* + +The following is a link to the online source repository. + +*Anonymous Access* + +The source can be checked out anonymously from git with this command:: + +.... +$ git clone https://github.com/apache/flume-spring-boot.git +.... + +*Developer Access* + +Everyone can access the Git repository via HTTP, but Committers must clone the git repository via HTTPS.: + +.... +$ git clone git@github.com:apache/flume-spring-boot.git +.... + +Committers should first commit the patch to trunk on your local repo: + +.... +$ git pull +$ git commit -m "A message" +$ git log +.... + +Copy the commit hash of the commit you just made. Then: + +.... +$ git pull +$ git cherry-pick (This should get committed immediately). +.... + +Now push to trunk: + +.... +$ git push -u origin trunk +.... + +For more details, please read: https://gitbox.apache.org/[Git at Apache]. + +Please note that the main development branch is *trunk*, not master. + +*Access Through a Proxy* + +The Git client can go through a proxy, if you configure it to do so. To configure git to use a proxy: + +.... +$ git config http.proxy address:port +.... + +Then do a git clone as usual: + +.... +$ git clone https://github.com/apache/flume-spring-boot +.... + +*Note 2:* Committers could use either Apache Gitbox or Github repositories. SVN can no longer be used to commit. diff --git a/src/site/antora/modules/ROOT/pages/getinvolved.adoc b/src/site/antora/modules/ROOT/pages/getinvolved.adoc new file mode 100644 index 0000000000..251d9f1a88 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/getinvolved.adoc @@ -0,0 +1,31 @@ +//// + 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. +//// + += How to Get Involved + +The Apache Flume project needs and appreciates all contributions, +including documentation help, source code improvements, problem reports, and +even general feedback! If you are interested +in contributing, please visit our Wiki page on how to contribute at: +https://cwiki.apache.org/confluence/display/FLUME/How+to+Contribute + +Also, consider joining the xref:mailinglists.adoc[mailing lists]. + +*How to Report Issues* + +The Apache Flume project uses JIRA for issue tracking. Please report any issues +you find at: https://issues.apache.org/jira/browse/FLUME diff --git a/src/site/antora/modules/ROOT/pages/index.adoc b/src/site/antora/modules/ROOT/pages/index.adoc new file mode 100644 index 0000000000..24dba49e30 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/index.adoc @@ -0,0 +1,600 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Welcome to Apache Flume + +Flume is a distributed, reliable, and available service for +efficiently collecting, aggregating, and moving large amounts of log +data. It has a simple and flexible architecture based on streaming +data flows. It is robust and fault tolerant with tunable reliability +mechanisms and many failover and recovery mechanisms. It +uses a simple extensible data model that allows for online analytic +application. + +image::DevGuide_image00.png[Agent component diagram] + +== News + +=== Oct 24, 2022 - Apache Flume 1.11.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.11.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Flume 1.11.0 is stable, production-ready software, and is backwards-compatible with +previous versions of the Flume 1.x codeline. + +This version of Flume adds support for deploying Flume as a Spring Boot application, adds support to the +Kafka source and sink for passing the Kafka timestamp and headers, and allows SSL hostname verification +to be disabled in the Kafka source and sink. + +Flume 1.11.0 contains a fix for https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-42468[CVE-2022-42468]. +See the xref:security.adoc[Flume Security] page for more details. + +The full change log and documentation are available on the +xref:releases/1.11.0.adoc[Flume 1.11.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +=== Aug 16, 2022 - Apache Flume 1.10.1 Released + +The Apache Flume team is pleased to announce the release of Flume 1.10.1. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Flume 1.10.1 is stable, production-ready software, and is backwards-compatible with +previous versions of the Flume 1.x codeline. + +This version of Flume adds the automatic module name to the manifest of the various Flume +jars allowing them to be usable in applications using the Java Platform Module System. + +The full change log and documentation are available on the +xref:releases/1.10.1.adoc[Flume 1.10.1 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +=== June 13, 2022 - Apache Flume 1.10.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.10.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Flume 1.10.0 is stable, production-ready software, and is backwards-compatible with +previous versions of the Flume 1.x codeline. + +Flume 1.10.0 contains a fix for https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-25167[CVE-2022-25167]. +See the xref:security.adoc[Flume Security] page for more details. + +This version of Flume upgrades many dependencies, resolving the CVEs associated with them. +Enhancements included in this release include the addition of a LoadBalancingChannelSelector, +the ability to retrieve the Flume configuration from a remote source such as a Spring +Cloud Config Server, and support for composite configurations. + +Flume has been updated to use Log4j 2.x instead of Log4j 1.x. + +The full change log and documentation are available on the +xref:releases/1.10.0.adoc[Flume 1.10.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +=== January 8, 2019 - Apache Flume 1.9.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.9.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.9.0 is the eleventh Flume release as an Apache top-level project. Flume +1.9.0 is stable, production-ready software, and is backwards-compatible with +previous versions of the Flume 1.x codeline. + +Several months of active development went into this release: about 70 patches were committed since 1.8.0, representing many features, enhancements, and bug fixes. While the full change log can be found on the 1.9.0 release page (link below), here are a few new feature highlights: + +____ +* Better SSL/TLS support +* Configuration Filters to provide a way to inject sensitive information like passwords into the configuration +* Float and Double value support in Context +* Kafka client upgraded to 2.0 +* HBase 2 support +____ + +Below is the list of people (from Git logs) who submitted and/or reviewed +improvements to Flume during the 1.9.0 development cycle: + +____ +* Andras Beni +* Attila Simon +* Bessenyei Balázs Donát +* Denes Arvay +* Endre Major +* Ferenc Szabo +* Hans Uhlig +* hunshenshi +* Jehan Bruggeman +* Laxman Ch +* Mike Percy +* Miklos Csanady +* Peter Turcsanyi +* Ralph Goers +* Takafumi Saito +* Tristan Stevens +* Udai Kiran Potluri +* Viktor Somogyi +* Yan Jian +____ + +The full change log and documentation are available on the +xref:releases/1.9.0.adoc[Flume 1.9.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== October 4, 2017 - Apache Flume 1.8.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.8.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.8.0 is the eleventh Flume release as an Apache top-level project. Flume +1.8.0 is stable, production-ready software, and is backwards-compatible with +previous versions of the Flume 1.x codeline. + +Several months of active development went into this release: about 80 patches were committed since 1.7.0, representing many features, enhancements, and bug fixes. While the full change log can be found on the 1.8.0 release page (link below), here are a few new feature highlights: + +____ +* Add Interceptor to remove headers from event +* Provide netcat UDP source as alternative to TCP +* Support environment variables in configuration files +____ + +Below is the list of people (from Git logs) who submitted and/or reviewed +improvements to Flume during the 1.8.0 development cycle: + +* Andras Beni +* Ashish Paliwal +* Attila Simon +* Ben Wheeler +* Bessenyei Balázs Donát +* Chris Horrocks +* Denes Arvay +* Ferenc Szabo +* Gabriel Commeau +* Hari Shreedharan +* Jeff Holoman +* Lior Zeno +* Marcell Hegedus +* Mike Percy +* Miklos Csanady +* Peter Ableda +* Peter Chen +* Ping Wang +* Pravin D'silva +* Robin Wang +* Roshan Naik +* Satoshi Iijima +* Shang Wu +* Siddharth Ahuja +* Takafumi Saito +* TeddyBear1314 +* Theodore michael Malaska +* Tristan Stevens +* dengkai02 +* eskrm +* filippovmn +* loleek + +The full change log and documentation are available on the +xref:releases/1.8.0.adoc[Flume 1.8.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== October 17, 2016 - Apache Flume 1.7.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.7.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.7.0 is the tenth Flume release as an Apache top-level project. +Flume 1.7.0 is stable, production-ready software, and is backwards-compatible +with previous versions of the Flume 1.x codeline. + +Several months of active development went into this release: almost 100 patches were committed since 1.6.0, representing many features, enhancements, and bug fixes. While the full change log can be found on the 1.7.0 release page (link below), here are a few new feature highlights: + +____ +* Taildir source +* Kafka integration improvements (eg. security) +____ + +Below is the list of people (from Git/SVN logs) who submitted and/or reviewed +improvements to Flume during the 1.7.0 development cycle: + +* Abraham Fine +* Alexandre Dutra +* Andrea Rota +* Ashish Paliwal +* Attila Simon +* Bessenyei Balázs Donát +* Daniel Templeton +* Deepesh Khandelwal +* Denes Arvay +* Dylan Jones +* Fonso Li +* Gonzalo Herreros +* Grant Henke +* Grigoriy Rozhkov +* Hari Shreedharan +* Neerja Khattar +* Jarek Jarcec Cecho +* Jeff Holoman +* Johny Rufus +* Jonathan Smith +* Jun Seok Hong +* Kevin Conaway +* lfzCarlosC +* Li Xiang +* Liam Mousseau +* Lionel Herbet +* Lior Zeno +* Michelle Casbon +* Mike Percy +* Miroslav Holubec +* Muhammad Ehsan ul Haquen +* Niccolo Becchi +* Phil D'Amore +* Phil Scalan +* Philip Zeyliger +* Ralph Goer +* Rigo MacTaggart +* Roshan Naik +* Santiago M. Mola +* Satoshi Iijima +* Siddharth Ahuja +* Sriharsha Chintalapani +* Somin Mithraa +* Sriharsha Chintalapani +* Ted Malaska +* tinawenqiao +* Tristan Stevens + +The full change log and documentation are available on the +xref:releases/1.7.0.adoc[Flume 1.7.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== May 20, 2015 - Apache Flume 1.6.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.6.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.6.0 is the ninth Flume release as an Apache top-level project. +Flume 1.6.0 is stable, production-ready software, and is backwards-compatible +with previous versions of the Flume 1.x codeline. + +Several months of active development went into this release: 105 patches were committed since 1.5.2, representing many features, enhancements, and bug fixes. While the full change log can be found on the 1.6.0 release page (link below), here are a few new feature highlights: + +____ +* Flume Sink and Source for Apache Kafka +* A new channel that uses Kafka +* Hive Sink based on the new Hive Streaming support +* End to End authentication in Flume +* Simple regex search-and-replace interceptor +____ + +The full change log and documentation are available on the +xref:releases/1.6.0.adoc[Flume 1.6.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== November 18, 2014 - Apache Flume 1.5.2 Released + +The Apache Flume team is pleased to announce the release of Flume 1.5.2 + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.5.2 is the eighth Flume release as an Apache top-level project. +Flume 1.5.2 is stable, production-ready software, and is backwards-compatible +with previous versions of the Flume 1.x codeline. + +Apache Flume 1.5.2 is a security and maintenance release that disables SSLv3 +on all components in Flume that support SSL/TLS. All users are encouraged to +update to this release as soon as possible. + +The full change log and documentation are available on the +xref:releases/1.5.2.adoc[Flume 1.5.2 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== July 16, 2014 - Apache Flume 1.5.0.1 Released + +The Apache Flume team is pleased to announce the release of Flume 1.5.0.1 + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.5.0.1 is the sixth Flume release as an Apache top-level project. +Flume 1.5.0.1 is stable, production-ready software, and is backwards-compatible +with previous versions of the Flume 1.x codeline. + +Apache Flume 1.5.0.1 is a maintenance release primarily meant to add support to build +against Apache HBase 0.98.x. This release adds a new build profile that builds Flume +against HBase 0.98.2. + +Apache BigTop 0.8.0 release will ship Flume binaries built +against HBase 0.98.x. + +The full change log and documentation are available on the +xref:releases/1.5.0.1.adoc[Flume 1.5.0.1 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== May 20, 2014 - Apache Flume 1.5.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.5.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.5.0 is the fifth Flume release as an Apache top-level project. +Flume 1.5.0 is stable, production-ready software, and is backwards-compatible +with previous versions of the Flume 1.x codeline. + +Several months of active development went into this release: 123 patches were committed since 1.4.0, representing many features, enhancements, and bug fixes. While the full change log can be found on the 1.5.0 release page (link below), here are a few new feature highlights: + +* New in-memory channel that can spill to disk +* A new dataset sink that use Kite API to write data to HDFS and HBase +* Support for Elastic Search HTTP API in Elastic Search Sink +* Much faster replay in the File Channel. + +The full change log and documentation are available on the +xref:releases/1.5.0.adoc[Flume 1.5.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== July 2, 2013 - Apache Flume 1.4.0 Released + +The Apache Flume team is pleased to announce the release of Flume 1.4.0. + +Flume is a distributed, reliable, and available service for efficiently +collecting, aggregating, and moving large amounts of streaming event data. + +Version 1.4.0 is the fourth Flume release as an Apache top-level project. +Flume 1.4.0 is stable, production-ready software, and is backwards-compatible +with previous versions of the Flume 1.x codeline. + +Six months of active development went into this release: 261 patches were committed since 1.3.1, representing many features, enhancements, and bug fixes. While the full change log can be found on the 1.4.0 release page (link below), here are a few new feature highlights: + +* New JMS Source +* New Solr Sink with ETL capabilities +* Updated ElasticSearch sink to support ES version 0.90 +* Support for secure SSL transport over Avro-RPC clients, sources & sinks +* Support for Thrift-RPC as a transport mechanism +* Support for embedding a Flume agent within applications +* Support for a new plugins.d directory structure for managing Flume addons +* Support for reading Avro files via the Spooling Directory source +* Support for writing Avro files with arbitrary schemas via the HDFS sink +* Support for ingesting Avro-serializable objects via the log4j API +* Improvements to the file channel to keep a backup checkpoint to avoid replays +* Performance improvements to the file channel, including group commit +* New file channel consistency check tool + +Below is the list of people (from Git/SVN logs) who submitted and/or reviewed +improvements to Flume during the 1.4.0 development cycle: + +* Alexander Alten-Lorenz +* Aline Guedes Pinto +* Brock Noland +* Cameron Gandevia +* Chris Birchall +* Christopher Nagy +* Deepesh Khandelwal +* Denny Ye +* Edward Sargisson +* Hari Shreedharan +* Israel Ekpo +* Ivan Bogdanov +* Jarek Jarcec Cecho +* Jeff Lord +* Joey Echeverria +* Jolly Chen +* Juhani Connolly +* Mark Grover +* Mike Percy +* Mubarak Seyed +* Nitin Verma +* Oliver B. Fischer +* Patrick Wendell +* Paul Chavez +* Pedro Urbina Escos +* Phil Scala +* Rahul Ravindran +* Ralph Goers +* Roman Shaposhnik +* Roshan Naik +* Sravya Tirukkovalur +* Steve Hoffman +* Ted Malaska +* Thiruvalluvan M. G. +* Thom DeCarlo +* Tim Bacon +* Tom White +* Venkat Ranganathan +* Venkatesh Sivasubramanian +* Will McQueen +* Wolfgang Hoschek + +The full change log and documentation are available on the +xref:releases/1.4.0.adoc[Flume 1.4.0 release page]. + +This release can be downloaded from the Flume xref:download.adoc[Download] page. + +Your contributions, feedback, help and support make Flume better! +For more information on how to report problems or contribute, +please visit our xref:getinvolved.adoc[Get Involved] page. + +The Apache Flume Team + +=== January 2, 2013 - Apache Flume 1.3.1 Released + +The Apache Flume team is pleased to announce the release of Flume version 1.3.1. +Apache Flume 1.3.1 is the fifth release under the auspices of Apache of the +so-called "NG" codeline, and our third release as a top-level Apache +project! Flume 1.3.1 has been put through many stress and regression tests, +is stable, production-ready software, and is backwards-compatible with +Flume 1.3.0 and Flume 1.2.0. + +Apache Flume 1.3.1 is a maintainance release for the 1.3.0 release, and includes +several bug fixes and performance enhancements. + +This release can be downloaded from the Flume download page at: +https://flume.apache.org/download.html + +The change log and documentation are available on the 1.3.1 release page: +https://flume.apache.org/releases/1.3.1.html + +Your help and feedback is more than welcome! + +=== December 2, 2012 - Apache Flume 1.3.0 Released + +The Apache Flume team is pleased to announce the release of Flume version 1.3.0. + +Apache Flume 1.3.0 is the fourth release under the auspices of Apache of the +so-called "NG" codeline, and our second release as a top-level Apache +project! Flume 1.3.0 has been put through many stress and regression tests, +is stable, production-ready software, and is backwards-compatible with +Flume 1.2.0. + +Four months of very active development went into this release: a whopping +221 patches were committed since 1.2.0, representing many features, +enhancements, and bug fixes. While the full change log can be found in the +link below, here are a few new feature highlights: + +* New HTTP Post Source +* New Spool Directory Source +* New Multi-port Syslog Source +* New Elastic Search Sink +* New Regex Extractor Interceptor +* File Channel Encryption + +This release can be downloaded from the Flume download page at: +https://flume.apache.org/download.html + +The change log and documentation are available on the 1.3.0 release page: +https://flume.apache.org/releases/1.3.0.html + +Your help and feedback is more than welcome! + +=== July 26, 2012 - Apache Flume 1.2.0 Released + +The Apache Flume team is pleased to announce the release of Flume version 1.2.0. + +Apache Flume 1.2.0 is the third release under the auspices of Apache of the +so-called "NG" codeline, and our first release as a top-level Apache +project! Flume 1.2.0 has been put through many stress and regression tests, +is stable, production-ready software, and is backwards-compatible with +Flume 1.1.0. + +Four months of very active development went into this release: a whopping +192 patches were committed since 1.1.0, representing many features, +enhancements, and bug fixes. While the full change log can be found in the +link below, here are a few new feature highlights: + +* New durable file channel +* New client API +* New HBase sinks (two different implementations) +* New Interceptor interface (a plugin processing API) +* New JMX-based monitoring support + +This release can be downloaded from the Flume download page at: +https://flume.apache.org/download.html + +The change log and documentation are available on the 1.2.0 release page: +https://flume.apache.org/releases/1.2.0.html + +Your help and feedback is more than welcome! + +=== July 26, 2012 - Flume Meetup NYC + +Strata {plus} Hadoop World (http://strataconf.com/stratany2012) will be +held October 23-25 in NYC. A Flume Meetup is being organized +around this event. This Meetup will be a good place for users to +interact with each other and with Flume developers. + +In order to help with organization, a https://docs.google.com/spreadsheet/viewform?formkey=dGRDUUxxbUI3TUJuYnQwMV9sVzJDZEE6MA#gid=0[form] +has been set up with a few questions about what kind of Meetup the community wants, and which evening is best. +Please fill out the https://docs.google.com/spreadsheet/viewform?formkey=dGRDUUxxbUI3TUJuYnQwMV9sVzJDZEE6MA#gid=0[form]. +Feel free to post to the User's mailing list with any questions. diff --git a/src/site/antora/modules/ROOT/pages/license.adoc b/src/site/antora/modules/ROOT/pages/license.adoc new file mode 100644 index 0000000000..2ff43377e8 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/license.adoc @@ -0,0 +1,134 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +*1. Definitions.* + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through +9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of +fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including +but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as +indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix +below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work +and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or +additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the +Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source +code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of +discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in +writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received +by Licensor and subsequently incorporated within the Work. + +*2. Grant of Copyright License.* Subject to the terms and conditions of this License, each Contributor hereby grants +to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, +prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative +Works in Source or Object form. + +*3. Grant of Patent License.* Subject to the terms and conditions of this License, each Contributor hereby grants +to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license +applies only to those patent claims licensable by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) +alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent +infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date +such litigation is filed. + +*4. Redistribution.* You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, +with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +[arabic] +. You must give any other recipients of the Work or Derivative Works a copy of this License; and +. You must cause any modified files to carry prominent notices stating that You changed the files; and +. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, +and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute +must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that +do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file +distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the +Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices +normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. +You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to +the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the +License. You may add Your own copyright statement to Your modifications and may provide additional or different license +terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as +a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in +this License. + +*5. Submission of Contributions.* Unless You explicitly state otherwise, any Contribution intentionally submitted for +inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any +additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any +separate license agreement you may have executed with Licensor regarding such Contributions. + +*6. Trademarks.* This License does not grant permission to use the trade names, trademarks, service marks, or product +names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +*7. Disclaimer of Warranty.* Unless required by applicable law or agreed to in writing, Licensor provides the Work +(and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of +using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +*8. Limitation of Liability.* In no event and under no legal theory, whether in tort (including negligence), contract, +or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, +shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or +consequential damages of any character arising as a result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any +and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such +damages. + +*9. Accepting Warranty or Additional Liability.* While redistributing the Work or Derivative Works thereof, You may +choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or +rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on +Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold +each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/src/site/antora/modules/ROOT/pages/mailinglists.adoc b/src/site/antora/modules/ROOT/pages/mailinglists.adoc new file mode 100644 index 0000000000..6110d5b654 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/mailinglists.adoc @@ -0,0 +1,29 @@ +//// + 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. +//// + += Mailing lists + +These are the mailing lists that have been established for the Apache Flume project. For each list, there is a subscribe, unsubscribe, and an archive link. + +[width="99%",cols="27%,21%,21%,31%",options="header",] +|=== +|Name |Subscribe |Unsubscribe |List Archive +|Flume User List |mailto:user-subscribe@flume.apache.org[user subscribe] |mailto:user-unsubscribe@flume.apache.org[user unsubscribe] |https://lists.apache.org/list.html?user@flume.apache.org[Flume User List Archive] +|Flume Developers List |mailto:dev-subscribe@flume.apache.org[dev subscribe] |mailto:dev-unsubscribe@flume.apache.org[dev unsubscribe] |https://lists.apache.org/list.html?dev@flume.apache.org[Flume Developer List Archive] +|Flume Commits List |mailto:commits-subscribe@flume.apache.org[commit subscribe] |mailto:commits-unsubscribe@flume.apache.org[commit unsubscribe] |https://lists.apache.org/list.html?commits@flume.apache.org[Flume Commits List Archive] +|Flume Issues List |mailto:issues-subscribe@flume.apache.org[issues subscribe] |mailto:issues-unsubscribe@flume.apache.org[issues unsubscribe] |https://lists.apache.org/list.html?issues@flume.apache.org[Flume Issues List Archive] +|=== diff --git a/src/site/antora/modules/ROOT/pages/releases/1.0.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.0.0.adoc new file mode 100644 index 0000000000..e07e27f649 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.0.0.adoc @@ -0,0 +1,170 @@ +//// + 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. +//// + += Version 1.0.0 - Incubating + +*Status of this release* + +This release is the first release of Apache Flume within the Apache +Incubator, and is labelled and should be considered as a beta version. + +*Release Documentation* + +* link:content/1.0.0-incubating/apidocs/index.html[API Documentation] + +*Changes* + +* {blank} ++ +Bug:: + ** ++[++FLUME-830++]++ - flume uber jar is missing files from flume-file-channel project + ** ++[++FLUME-831++]++ - flume-jdbc-channel project has unnecessary direct dependency on log4j API + ** ++[++FLUME-833++]++ - Audit Direct Library Deps for Flume NG + ** ++[++FLUME-835++]++ - Issues during clean build of Flume NG + ** ++[++FLUME-850++]++ - Upgrade the version of Hadoop we use for HDFS sink + ** ++[++FLUME-858++]++ - HDFSWriterFactory is using operation == for string comparison + ** ++[++FLUME-863++]++ - Use of unknown sink type leads to NullPointerException + ** ++[++FLUME-868++]++ - RAT checks fail on builds.apache.org due to local maven repo + ** ++[++FLUME-869++]++ - JDBC channel tests leave derby.log in module directory + ** ++[++FLUME-870++]++ - LoggerSink contains two calls to Transaction++#++commit() + ** ++[++FLUME-880++]++ - HDFSFormatterFactory is using == operator for String objects + ** ++[++FLUME-887++]++ - Add maven assembly to build a source only artifact + ** ++[++FLUME-891++]++ - flume-ng script doesn't build the classpath properly + ** ++[++FLUME-894++]++ - Add log4j as part of the build + ** ++[++FLUME-898++]++ - Create DISCLAIMER file for Flume project + ** ++[++FLUME-900++]++ - RELEASENOTES file needs to be ignored by RAT + ** ++[++FLUME-902++]++ - Remove thrift references in NG build + ** ++[++FLUME-903++]++ - Update project metadata in main pom + ** ++[++FLUME-904++]++ - Update plugin and dependency repos referenced in the main pom + ** ++[++FLUME-905++]++ - ExecSource silently fails after first transaction with channel + ** ++[++FLUME-906++]++ - Maven Avro plugin missing an entry in plugin dep management + ** ++[++FLUME-907++]++ - Maven assembly missing CHANGELOG and other misc files + ** ++[++FLUME-908++]++ - Clean out old bin and conf contents + ** ++[++FLUME-909++]++ - org.apache.flume.node.TestAbstractLogicalNodeManager is failing on some machines + ** ++[++FLUME-910++]++ - Typo in maven avro plugin groupId in plugin dep management + ** ++[++FLUME-911++]++ - README should reference Apache Flume rather than just Flume + ** ++[++FLUME-912++]++ - DEVNOTES contains outdated info + ** ++[++FLUME-913++]++ - slf4j-log4j binding is excluded from the dist assembly due to test scope + ** ++[++FLUME-915++]++ - Incorrect license information in various files + ** ++[++FLUME-916++]++ - DISCLAIMER file has an incorrect URL +* {blank} ++ +Improvement:: + ** ++[++FLUME-846++]++ - Bump Avro version to 1.6.x + ** ++[++FLUME-867++]++ - Pollable source and sink runners should reduce poll interval after several BACKOFFs + ** ++[++FLUME-871++]++ - HDFS sink needs to handle blocked/hung append operation +* {blank} ++ +Question:: + ** ++[++FLUME-856++]++ - Move data across hosts +* {blank} ++ +Task:: + ** ++[++FLUME-876++]++ - Update README, NOTICE, LICENSE, and DEVNOTES files + ** ++[++FLUME-878++]++ - Write release-ready Maven assembly descriptor + ** ++[++FLUME-879++]++ - Document Flume's ASF release process + ** ++[++FLUME-885++]++ - Set version number of project to 1.0.0-SNAPSHOT for NG branch + ** ++[++FLUME-899++]++ - Add Release notes + ** ++[++FLUME-901++]++ - Make Flume NG build and pass tests against Hadoop 0.23 branch + +Release Notes - Flume - Version NG alpha 2 - 20111107 + +* {blank} ++ +Bug:: + ** ++[++FLUME-773++]++ - ExecSource doesn't rollback transactions on errors + ** ++[++FLUME-805++]++ - HDFS sink should mangle the names of incomplete files till they are closed + ** ++[++FLUME-815++]++ - Test json config file has missing bind property + ** ++[++FLUME-816++]++ - TestJdbcChannelProvider throws OOME based on RNG values + ** ++[++FLUME-817++]++ - JdbcChannel can not be created by DefaultChannelFactory + ** ++[++FLUME-818++]++ - PropertiesFileConfigurationProvider doesn't properly log exceptions + ** ++[++FLUME-822++]++ - JDBC channel lock acquisition failure during take() + ** ++[++FLUME-823++]++ - The properties configuration provider should fail if the configuration file is not found + ** ++[++FLUME-825++]++ - Need to remove dependency on hadoop core from flume-ng-core project + ** ++[++FLUME-827++]++ - Avro client conn failure results in 60-second wait before terminating + ** ++[++FLUME-848++]++ - Typo is TestHDFSEventSink path + ** ++[++FLUME-861++]++ - AvroSource is failing on ClosedChannelException +* {blank} ++ +Improvement:: + ** ++[++FLUME-819++]++ - JDBC channel plugin is not registered with Flume node + ** ++[++FLUME-820++]++ - JDBC channel should support capacity specification. + ** ++[++FLUME-821++]++ - Derby schema handler should create the necessary indexes for fast lookups. + ** ++[++FLUME-826++]++ - Update libs +* {blank} ++ +New Feature:: + ** ++[++FLUME-775++]++ - Support text output + ** ++[++FLUME-814++]++ - Add support for multiple channels to sources +* {blank} ++ +Task:: + ** ++[++FLUME-812++]++ - Enable Apache RAT checks during Maven build + ** ++[++FLUME-866++]++ - Remove old plugins and log4j appender + +Release Notes - Flume - Version NG alpha 1 - 20111021 + +* {blank} ++ +Sub-task:: + ** ++[++FLUME-737++]++ - Port Flume OG sources and sinks to NG interfaces + ** ++[++FLUME-739++]++ - Create NG node configuration components + ** ++[++FLUME-747++]++ - Create NG command line launchers and daemon infrastructure + ** ++[++FLUME-760++]++ - Implement JDBC based channel implementation + ** ++[++FLUME-761++]++ - Implement HDFS Flume NG sink + ** ++[++FLUME-777++]++ - Support text output for HDFS sink + ** ++[++FLUME-795++]++ - Replace the non-transactional memory channel with new transactional memory channel +* {blank} ++ +Bug:: + ** ++[++FLUME-769++]++ - FLUME-728 - TestJsonFileConfigurationProvider fails due to timing issue + ** ++[++FLUME-784++]++ - MemoryChannel should poll with timeout on take() rather than block indefinitely + ** ++[++FLUME-788++]++ - Add more test cases to Flume-NG HDFS test + ** ++[++FLUME-803++]++ - support re-entrant transaction for memory channel + ** ++[++FLUME-806++]++ - Fix cast exception in MemoryChannel due to config type changes + ** ++[++FLUME-807++]++ - Fix tests broken by FLUME-802 changes + ** ++[++FLUME-809++]++ - Fix channel syntax javadoc bug in PropertiesFileConfigurationProvider + ** ++[++FLUME-811++]++ - Remove logging of avro client that causes errors with proxy object methods +* {blank} ++ +Epic:: + ** ++[++FLUME-728++]++ - Flume NG refactoring +* {blank} ++ +Improvement:: + ** ++[++FLUME-772++]++ - MemoryChannel should push events back into channel on rollback + ** ++[++FLUME-774++]++ - Move HDFS sink into a separate module + ** ++[++FLUME-781++]++ - Add error checking to AvroCLICilent + ** ++[++FLUME-782++]++ - Instrument AvroSource with counters + ** ++[++FLUME-783++]++ - Add a batch event RPC call to AvroSource + ** ++[++FLUME-804++]++ - Support help and node name arguments from the command line + ** ++[++FLUME-810++]++ - Add help command line options to AvroCLIClient +* {blank} ++ +New Feature:: + ** ++[++FLUME-771++]++ - Implement NG Avro source + ** ++[++FLUME-778++]++ - Implement NG Avro sink + ** ++[++FLUME-779++]++ - Create an Avro CLI for sending data to the Avro source +* {blank} ++ +Task:: + ** ++[++FLUME-780++]++ - Reduce default log levels for chatty libraries + ** ++[++FLUME-785++]++ - Write javadoc for builtin channels + ** ++[++FLUME-786++]++ - Write javadoc for builtin sources + ** ++[++FLUME-787++]++ - Write javadoc for builtin sinks + ** ++[++FLUME-801++]++ - Write NG getting started guide + ** ++[++FLUME-802++]++ - Complete PropertyFileConfigurationProvider implementation diff --git a/src/site/antora/modules/ROOT/pages/releases/1.1.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.1.0.adoc new file mode 100644 index 0000000000..a22efdf969 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.1.0.adoc @@ -0,0 +1,92 @@ +//// + 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. +//// + += Version 1.1.0 - Incubating + +*Status of this release* + +This release is the second release of Apache Flume within the Apache +Incubator, and is labelled and should be considered as a beta version. +As compared to the previous release, it has substantially more features +and functionality along with bug fixes and other enhancements. However +it is likely to change until a stable release version. + +*Release Documentation* + +* link:content/1.1.0-incubating/apidocs/index.html[API Documentation] + +*Changes* + +* {blank} ++ +Sub-task:: + ** ++[++FLUME-989++]++ - Factor Flume Avro RPC interfaces out into separate Client SDK +* {blank} ++ +Bug:: + ** ++[++FLUME-11++]++ - Tests are setting logger level and should not be. + ** ++[++FLUME-889++]++ - All events in memory channel are lost on reconfiguration + ** ++[++FLUME-920++]++ - flume-ng script does not work on Ubuntu Maverick + ** ++[++FLUME-933++]++ - Default++[++Sourcelink:##SUBST##|Sink|[++|++Sink++|++]Channel++]++Factory implementation should do reference counting for create/unregistering instances. + ** ++[++FLUME-936++]++ - MemoryChannel is not thread safe + ** ++[++FLUME-955++]++ - Rat failure: Legacy Avro Source missing Apache license header + ** ++[++FLUME-957++]++ - Remove unused flume json config file + ** ++[++FLUME-960++]++ - TestAvroSink.testFailedConnect is racy and fails often + ** ++[++FLUME-963++]++ - Add additional tests to TestHDFSEventSink and demystify existing tests + ** ++[++FLUME-1005++]++ - Several issues with flume-ng script + ** ++[++FLUME-1009++]++ - HDFSEventSink should return BACKOFF when the channel returns null + ** ++[++FLUME-1018++]++ - Context can cause NullPointerException + ** ++[++FLUME-1027++]++ - Missing log4j library in Flume distribution + ** ++[++FLUME-1029++]++ - Flume build issue with Avro 1.6.2 and empty local repository + ** ++[++FLUME-1031++]++ - Depricate code generated by Thrift and Avro OG sources that is under com.cloudera package +* {blank} ++ +Improvement:: + ** ++[++FLUME-886++]++ - Create Log4j Appender + ** ++[++FLUME-919++]++ - flume-ng script should use exec when spawning the java process + ** ++[++FLUME-922++]++ - Straighten up branches for development + ** ++[++FLUME-925++]++ - Update build infrastructure to follow Apache Maven guidelines + ** ++[++FLUME-932++]++ - Making flume-ng components pluggage and name aware + ** ++[++FLUME-934++]++ - hadoop 1.0.0 sink and corresponding profile + ** ++[++FLUME-935++]++ - Create abstract implementations of basic channel/transaction semantics + ** ++[++FLUME-939++]++ - Load flume-env.sh from flume++_++conf++_++dir environment variable / system property as opposed to bin directory + ** ++[++FLUME-945++]++ - Add the ability to specify a default channel for multiplexing channel selector. + ** ++[++FLUME-956++]++ - Configuration File Template + ** ++[++FLUME-958++]++ - Miscellaneous build improvements + ** ++[++FLUME-964++]++ - Remove compiler warnings where possible + ** ++[++FLUME-978++]++ - Context interface is too basic requiring boilerplate user code + ** ++[++FLUME-984++]++ - SinkRunner should catch unhanded exceptions and log them like PollingSourceRunner + ** ++[++FLUME-990++]++ - Hive sink + ** ++[++FLUME-1019++]++ - Document Sink and related interfaces, defining expected behaviors + ** ++[++FLUME-1021++]++ - Document API contracts and expected behavior in additional interfaces, including Source + ** ++[++FLUME-1032++]++ - Fix / clean up Flume NG build +* {blank} ++ +New Feature:: + ** ++[++FLUME-865++]++ - Implement failover sink + ** ++[++FLUME-892++]++ - Support for SysLog as source + ** ++[++FLUME-914++]++ - Port the IRC sink to flume ng + ** ++[++FLUME-930++]++ - Support for multiplexing into different channels from single source. + ** ++[++FLUME-942++]++ - Support event compatibility with Flume 0.9x + ** ++[++FLUME-970++]++ - Create user guide for Flume NG +* {blank} ++ +Task:: + ** ++[++FLUME-940++]++ - Remove unused code from Flume + ** ++[++FLUME-949++]++ - Collapse PollableSink into Sink interface. + ** ++[++FLUME-977++]++ - Migrate trunk to 0.9.5 branch and move branch flume-728 over to trunk + ** ++[++FLUME-1028++]++ - Fix jenkins build after addition of submodule diff --git a/src/site/antora/modules/ROOT/pages/releases/1.10.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.10.0.adoc new file mode 100644 index 0000000000..e276919ca7 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.10.0.adoc @@ -0,0 +1,79 @@ +//// + 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. +//// + += Version 1.10.0 + +*Status of this release* + +Apache Flume 1.10.0 is the twelfth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.10.0 is production-ready software. + +*Release Documentation* + +* link:content/1.10.0/FlumeUserGuide.html[Flume 1.10.0 User Guide] (also in link:content/1.10.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.10.0/FlumeDeveloperGuide.html[Flume 1.10.0 Developer Guide] (also in link:content/1.10.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.10.0/apidocs/index.html[Flume 1.10.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.10.0 + +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3151[FLUME-3151]++]++ - Upgrade Hadoop to 2.10.1 + * ++[++https://issues.apache.org/jira/browse/FLUME-3311[FLUME-3311]++]++ - Update Wrong Use In HDFS Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-3316[FLUME-3316]++]++ - Syslog Rfc3164Date test fails when the test date falls on a leap day + * ++[++https://issues.apache.org/jira/browse/FLUME-3328[FLUME-3328]++]++ - Fix Deprecated Properties table of HDFS Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-3356[FLUME-3356]++]++ - Probable security issue in Flume + * ++[++https://issues.apache.org/jira/browse/FLUME-3360[FLUME-3360]++]++ - Maven assemble failed on macOS + * ++[++https://issues.apache.org/jira/browse/FLUME-3395[FLUME-3395]++]++ - Fix for CVE-2021-44228 + * ++[++https://issues.apache.org/jira/browse/FLUME-3407[FLUME-3407]++]++ - workaround for jackson-mapper-asl-1.9.13.jar @ flume-ng + * ++[++https://issues.apache.org/jira/browse/FLUME-3409[FLUME-3409]++]++ - upgrade httpclient due to cve + * ++[++https://issues.apache.org/jira/browse/FLUME-3416[FLUME-3416]++]++ - Improve input validation + * ++[++https://issues.apache.org/jira/browse/FLUME-3421[FLUME-3421]++]++ - Default log4j settings do not log to console after FLUME-2050 + * ++[++https://issues.apache.org/jira/browse/FLUME-3426[FLUME-3426]++]++ - Unresolved Security Issues +++**++ New Feature:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3412[FLUME-3412]++]++ - Add LoadBalancingChannelSelector +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-199[FLUME-199]++]++ - Unit tests should hunt for available ports if defaults are in use + * ++[++https://issues.apache.org/jira/browse/FLUME-2050[FLUME-2050]++]++ - Upgrade to log4j2 (when GA) + * ++[++https://issues.apache.org/jira/browse/FLUME-3045[FLUME-3045]++]++ - Document GitHub Pull Requests in How to Contribute Guide + * ++[++https://issues.apache.org/jira/browse/FLUME-3335[FLUME-3335]++]++ - Support configuration and reconfiguration via HTTP(S) + * ++[++https://issues.apache.org/jira/browse/FLUME-3338[FLUME-3338]++]++ - Doc Flume Recoverability with Kafka + * ++[++https://issues.apache.org/jira/browse/FLUME-3363[FLUME-3363]++]++ - CVE-2019-20445 + * ++[++https://issues.apache.org/jira/browse/FLUME-3368[FLUME-3368]++]++ - Update Jackson to 2.9.10 + * ++[++https://issues.apache.org/jira/browse/FLUME-3389[FLUME-3389]++]++ - Build and test Apache Flume on ARM64 CPU architecture + * ++[++https://issues.apache.org/jira/browse/FLUME-3397[FLUME-3397]++]++ - Upgrade Log4 to 2.17.1 and SLF4J to 1.7.32 + * ++[++https://issues.apache.org/jira/browse/FLUME-3398[FLUME-3398]++]++ - Upgrade Kafka to a supported version. + * ++[++https://issues.apache.org/jira/browse/FLUME-3399[FLUME-3399]++]++ - Update Jackson to 2.13.1 + * ++[++https://issues.apache.org/jira/browse/FLUME-3403[FLUME-3403]++]++ - The parquet-avro version used by flume is 1.4.1, which is vulnerable. + * ++[++https://issues.apache.org/jira/browse/FLUME-3405[FLUME-3405]++]++ - Reopened - The parquet-avro version used by flume is 1.4.1, which is vulnerable. + * ++[++https://issues.apache.org/jira/browse/FLUME-3413[FLUME-3413]++]++ - Add "initialization" phase to components. +++**++ Wish:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3400[FLUME-3400]++]++ - Upgrade commons-io to 2.11.0 +++**++ Task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3401[FLUME-3401]++]++ - Remove Kite Dataset Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-3402[FLUME-3402]++]++ - remove org.codehaus.jackson dependencies + * ++[++https://issues.apache.org/jira/browse/FLUME-3404[FLUME-3404]++]++ - Update Commons CLI to 1.5.0, Commons Codec to 1.15, Commons Compress to 1.21 and Commons Lang to 2.6 + * ++[++https://issues.apache.org/jira/browse/FLUME-3410[FLUME-3410]++]++ - upgrade hbase version + * ++[++https://issues.apache.org/jira/browse/FLUME-3411[FLUME-3411]++]++ - upgrade hive sink to 1.2.2 + * ++[++https://issues.apache.org/jira/browse/FLUME-3417[FLUME-3417]++]++ - Remove Elasticsearch sink that requires Elasticsearch 0.90.1 + * ++[++https://issues.apache.org/jira/browse/FLUME-3419[FLUME-3419]++]++ - Review project LICENSE and NOTICE + * ++[++https://issues.apache.org/jira/browse/FLUME-3424[FLUME-3424]++]++ - Upgrade Twitter4j to version 4.0.7{plus} +++**++ Dependency upgrade:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3339[FLUME-3339]++]++ - Remove Xerces and Xalan dependencies + * ++[++https://issues.apache.org/jira/browse/FLUME-3385[FLUME-3385]++]++ - flume-ng-sdk uses Avro-IPC version with vulnerable version of Jetty + * ++[++https://issues.apache.org/jira/browse/FLUME-3386[FLUME-3386]++]++ - flume-ng-sdk uses vulnerable version of netty diff --git a/src/site/antora/modules/ROOT/pages/releases/1.10.1.adoc b/src/site/antora/modules/ROOT/pages/releases/1.10.1.adoc new file mode 100644 index 0000000000..b647bf808b --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.10.1.adoc @@ -0,0 +1,40 @@ +//// + 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. +//// + += Version 1.10.1 + +*Status of this release* + +Apache Flume 1.10.1 is the next release of Flume as an Apache top-level project +(TLP). Apache Flume 1.10.1 is production-ready software. + +*Release Documentation* + +* link:content/1.10.1/FlumeUserGuide.html[Flume 1.10.1 User Guide] (also in link:content/1.10.1/FlumeUserGuide.pdf[pdf]) +* link:content/1.10.1/FlumeDeveloperGuide.html[Flume 1.10.1 Developer Guide] (also in link:content/1.10.1/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.10.1/apidocs/index.html[Flume 1.10.1 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.10.1 + +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3428[FLUME-3428]++]++ - Fix for CVE-2022-34916, improper use of JNDI in JMSMessageConsumer + * ++[++https://issues.apache.org/jira/browse/FLUME-3434[FLUME-3434]++]++ - TwitterSource exceptions on serialization +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3427[FLUME-3427]++]++ - Add support for JPMS + * ++[++https://issues.apache.org/jira/browse/FLUME-3433[FLUME-3433]++]++ - Limit the default Lookups to a specific few diff --git a/src/site/antora/modules/ROOT/pages/releases/1.11.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.11.0.adoc new file mode 100644 index 0000000000..24da16c287 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.11.0.adoc @@ -0,0 +1,48 @@ +//// + 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. +//// + += Version 1.11.0 + +*Status of this release* + +Apache Flume 1.11.0 is the next release of Flume as an Apache top-level project +(TLP). Apache Flume 1.11.0 is production-ready software. + +*Release Documentation* + +* link:content/1.10.1/FlumeUserGuide.html[Flume 1.11.0 User Guide] (also in link:content/1.11.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.11.0/FlumeDeveloperGuide.html[Flume 1.11.0 Developer Guide] (also in link:content/1.11.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.11.0/apidocs/index.html[Flume 1.11.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.11.0 + +++**++ Bug:: + * ++[++FLUME-3315++]++ - ++[++KafkaSink++][++KafkaSource++]++ Impossible to disable hostname verification with SSL enryption + * ++[++FLUME-3437++]++ - Validate providerUrl +++**++ New Feature:: + * ++[++FLUME-3440++]++ - Add support for Spring Boot +++**++ Improvement:: + * ++[++FLUME-3435++]++ - Allow KafkaSink to include timestamp and KafkaHeaders +++**++ Dependency upgrade:: + * {blank} + + + ++[++FLUME-3441++]++ - Dependency Upgrades for Flume 1.11.0;; + ** Update Maven Jar Plugin to 3.2.2 + ** Update Scala library to 2.13.9 + ** Update Gson to 2.9.1 diff --git a/src/site/antora/modules/ROOT/pages/releases/1.2.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.2.0.adoc new file mode 100644 index 0000000000..97fe17cecd --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.2.0.adoc @@ -0,0 +1,218 @@ +//// + 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. +//// + += Version 1.2.0 + +*Status of this release* + +This release is the first release of Apache Flume as an Apache top level project and +is also the first release that is considered ready for production use. +As compared to the previous releases, it has substantially more features +and functionality along with bug fixes and other enhancements. + +*Release Documentation* + +* link:content/1.2.0/FlumeUserGuide.pdf[Flume User Guide] +* link:content/1.2.0/FlumeDeveloperGuide.pdf[Flume Developer Guide] +* link:content/1.2.0/apidocs/index.html[API Documentation] + +*Changes* + +++**++ New Feature:: + * ++[++FLUME-896++]++ - Implement a Durable Memory Channel + * ++[++FLUME-971++]++ - Create developer guide for Flume NG + * ++[++FLUME-988++]++ - Client SDK + * ++[++FLUME-1085++]++ - Implement a durable FileChannel + * ++[++FLUME-1157++]++ - Implement Interceptors (previously known as Decorators) for Flume 1.x + * ++[++FLUME-1183++]++ - Implement an HBase Sink which supports table level access + * ++[++FLUME-1215++]++ - Implement Timestamp Interceptor + * ++[++FLUME-1252++]++ - Asynchronous HBase Sink +++**++ Improvement:: + * ++[++FLUME-828++]++ - LoggerSink representation of the event's body isn't too useful + * ++[++FLUME-881++]++ - Would be nice if HDFS Sink would automatically choose best writableFormat based on fileType + * ++[++FLUME-979++]++ - ExecSource should optionally restart the command when it exits + * ++[++FLUME-985++]++ - All HDFS Operations in HDFSEventSink should have a timeout + * ++[++FLUME-1001++]++ - Support custom processors + * ++[++FLUME-1011++]++ - AvroSource should have a configurable max thread count + * ++[++FLUME-1020++]++ - Implement Kerberos security for HDFS Sink + * ++[++FLUME-1030++]++ - Retry logic for failover sink processor to handle downstream exceptions in a predictable manner. + * ++[++FLUME-1032++]++ - Fix / clean up Flume NG build + * ++[++FLUME-1043++]++ - SDK should mark slf4j deps as optional + * ++[++FLUME-1048++]++ - speed up mvn package: stop building .zip packages + * ++[++FLUME-1049++]++ - Use hadoop-1.0.0 as basis for default Flume build instead of 0.20.205 + * ++[++FLUME-1078++]++ - flume-ng script has no way to add, not replace, classpath + * ++[++FLUME-1090++]++ - JDBC Channel: Minimize logging under nominal conditions + * ++[++FLUME-1117++]++ - Support output to files in Avro container format + * ++[++FLUME-1122++]++ - Flume documentation layout should be refactored + * ++[++FLUME-1126++]++ - Support RFC 3164 and 5424 syslog format timestamp parsing + * ++[++FLUME-1127++]++ - Add configuration support to AbstractAvroEventSerializer for Avro sync interval and compression support + * ++[++FLUME-1132++]++ - HDFSEventSink has spurious and verbose log message + * ++[++FLUME-1140++]++ - Adding Xms value in flume-env.sh + * ++[++FLUME-1160++]++ - ComponentConfigurationFactory catches NullPointerException + * ++[++FLUME-1196++]++ - Allow different HDFS Sinks within the same agent to write to HDFS as different users + * ++[++FLUME-1198++]++ - Implement a load-balancing sink processor + * ++[++FLUME-1212++]++ - Flume should pick HBase jars from HBASE++_++HOME + * ++[++FLUME-1238++]++ - Support active rolling of files created by HDFS Event Sink + * ++[++FLUME-1242++]++ - Make flume user & dev guides easily editable + * ++[++FLUME-1275++]++ - Add Regex Serializer for HBaseSink + * ++[++FLUME-1287++]++ - Add Standalone Example to Docs + * ++[++FLUME-1330++]++ - Avro Source should not use Fixed thread pool for boss threads when pool size is specified + * ++[++FLUME-1338++]++ - Produce helpful error message in case that timestamp header is missing when time based bucketing is in use + * ++[++FLUME-1343++]++ - Improve user guide + * ++[++FLUME-1345++]++ - Use apache-flume for the artifact instead of flume-ng-dist + * ++[++FLUME-1351++]++ - Add release version to Flume documentation +++**++ Bug:: + * ++[++FLUME-862++]++ - AvroSource breaks when config properties changes different service + * ++[++FLUME-1002++]++ - FailoverSinkProcessor replaces sinks with same priority + * ++[++FLUME-1017++]++ - syslog classes missing + * ++[++FLUME-1026++]++ - Document Thread Safety Guarantees + * ++[++FLUME-1027++]++ - Missing log4j library in Flume distribution + * ++[++FLUME-1031++]++ - Depricate code generated by Thrift and Avro OG sources that is under com.cloudera package + * ++[++FLUME-1035++]++ - slf4j error in flume sdk unit tests + * ++[++FLUME-1036++]++ - Reconfiguration of AVRO or NETCAT source causes port bind exception + * ++[++FLUME-1037++]++ - NETCAT handler theads terminate under stress test + * ++[++FLUME-1040++]++ - Release-Notes says Apache Ivy instead of Apache Flume + * ++[++FLUME-1041++]++ - maven warns of duplicate dependencies + * ++[++FLUME-1046++]++ - invoking flume-ng script from bin directory fails + * ++[++FLUME-1047++]++ - Client SDK has dependency on apache commons + * ++[++FLUME-1070++]++ - Fix javadoc for configuring hdfsSink + * ++[++FLUME-1074++]++ - AvroSink if any non-caught exception is thrown, an exception is thrown in finally clause + * ++[++FLUME-1075++]++ - HDFSEventSink begin is called when transaction opened due to other error + * ++[++FLUME-1079++]++ - Flume agent reconfiguration enters permanent bad state + * ++[++FLUME-1080++]++ - Issue with HDFSEventSink for append support + * ++[++FLUME-1083++]++ - Why does flume binary archive produces the following empty directories: bin/++{++ia64,amd64} ? + * ++[++FLUME-1087++]++ - Restore Client API compat with v1.1.0 + * ++[++FLUME-1088++]++ - TestWAL.testThreadedAppend fails on jenkins build server + * ++[++FLUME-1094++]++ - hadoop.profile=23 build is broken by slf4j-jcl dependencies + * ++[++FLUME-1096++]++ - Add support to pass headers through AvroCLIClient + * ++[++FLUME-1098++]++ - Hadoop jars from compilation step included in assembly build + * ++[++FLUME-1099++]++ - copy-paste issue with RecoverableMemoryChannel + * ++[++FLUME-1102++]++ - HDFSEventSink rollInterval is broken + * ++[++FLUME-1104++]++ - HDFS rolls the first file incorrectly + * ++[++FLUME-1108++]++ - FILE++_++ROLL sink doesn't accept value 0 for unlimited wait time before rolling file + * ++[++FLUME-1109++]++ - Syslog sources need to be refactored + * ++[++FLUME-1112++]++ - HDFSCompressedDataStream append does not work + * ++[++FLUME-1114++]++ - Syslog Sources does not implement maxsize + * ++[++FLUME-1116++]++ - Extra event created for max payload size of 2500 bytes in Flume syslogtcp source + * ++[++FLUME-1119++]++ - Remove default ports for syslog sources + * ++[++FLUME-1121++]++ - Recoverable Memory Channel cannot recover data + * ++[++FLUME-1124++]++ - Lifecycle supervisor can cause thread contention, sometimes causing components to not startup. + * ++[++FLUME-1125++]++ - flume-ng script allows flume-env.sh to clobber some command-line arguments + * ++[++FLUME-1128++]++ - Conf poller should use schedule with fixed delay + * ++[++FLUME-1129++]++ - change foo to agent in sample config + * ++[++FLUME-1130++]++ - flume-ng script bad ordering on FLUME++_++HOME var + * ++[++FLUME-1135++]++ - flume-docs exclude is not sufficient for rat + * ++[++FLUME-1136++]++ - Remove from executor service does not always remove the runnables from the queue + * ++[++FLUME-1142++]++ - Seq source fails with multiplexing channel selector + * ++[++FLUME-1148++]++ - Refactor logging + * ++[++FLUME-1149++]++ - All sources get same channel list even if configuration is different. + * ++[++FLUME-1154++]++ - flume-ng script should first try finding java from PATH and then try using bigtop, instead of vice-versa + * ++[++FLUME-1156++]++ - If config file has empty sources, then throws NPE + * ++[++FLUME-1163++]++ - HDFSEventSink leaves .tmp files in place when Flume is stopped + * ++[++FLUME-1164++]++ - Configure should be called after stopping all events. + * ++[++FLUME-1177++]++ - Maven deps on flume-ng-configuration module are brought in transitively instead of directly + * ++[++FLUME-1180++]++ - ChannelSelectorFactory creates incorrect selector for multiplexing selector type + * ++[++FLUME-1181++]++ - Context must enforce dot-separated prefix for sub-properties. + * ++[++FLUME-1182++]++ - Syslog source cannot read format correctly from configuration + * ++[++FLUME-1184++]++ - TestFileChannel.testThreaded fails sometimes + * ++[++FLUME-1188++]++ - TestRecoverableMemoryChannel.testThreaded can fail sometimes + * ++[++FLUME-1190++]++ - DurableFileChannel requires FILE enum definition in ChannelConfigurationType + * ++[++FLUME-1194++]++ - RecoverableMemoryChannel prop misspelled -- "rentention" should be "retention" + * ++[++FLUME-1200++]++ - HDFSEventSink causes `++*++.snappy` file to be created in HDFS even when snappy isn't used (due to missing lib) + * ++[++FLUME-1202++]++ - Too many approved licenses + * ++[++FLUME-1204++]++ - Add more unit tests for hbase sink + * ++[++FLUME-1205++]++ - NPE related to checkpointing when using FileChannel + * ++[++FLUME-1213++]++ - HDFS sink should allow bucketpath rounding down. + * ++[++FLUME-1216++]++ - Need useful error message when keytab does not exist + * ++[++FLUME-1217++]++ - HDFS Event Sink generates warnings due to recent change + * ++[++FLUME-1219++]++ - Race conditions in BucketWriter / HDFSEventSink + * ++[++FLUME-1220++]++ - Load balancing channel selector needs to be in the configuration type + * ++[++FLUME-1221++]++ - ThriftLegacySource doesn't handle fields -++>++ headers conversions for bytebuffers + * ++[++FLUME-1226++]++ - FailoverRpcClient should check for NULL batch-size property + * ++[++FLUME-1229++]++ - System.nanoTime incorrectly used in filename for HDFS file rolling + * ++[++FLUME-1230++]++ - Sink gets initialized even when not active + * ++[++FLUME-1231++]++ - Deadlock between BucketWriter and LeaseChecker on shutdown + * ++[++FLUME-1232++]++ - Cannot start agent a 3rd time when using FileChannel + * ++[++FLUME-1234++]++ - Can't use %P escape sequence for bucket path of HDFS sink + * ++[++FLUME-1236++]++ - File channel has a race condition between start and create transaction method + * ++[++FLUME-1240++]++ - Add version info to Flume NG + * ++[++FLUME-1241++]++ - Flume dist should include the flume-ng-doc directory + * ++[++FLUME-1244++]++ - Implement a load-balancing RpcClient with round/robin and random distribution capabilties. + * ++[++FLUME-1245++]++ - HDFSCompressedDataStream calls finish() on sync instead of flush() + * ++[++FLUME-1246++]++ - FileChannel hangs silently when Hadoop libs not found + * ++[++FLUME-1248++]++ - flume-ng script gets broken when it tried to load hbase classpath + * ++[++FLUME-1253++]++ - Support for running integration tests + * ++[++FLUME-1254++]++ - RpcClient can hang when communication is broken with the source. + * ++[++FLUME-1270++]++ - Incorrect default hdfs.callTimeout and hdfs.fileType of HDFSEventSink in FlumeUserGuide.rst + * ++[++FLUME-1271++]++ - Incorrect configuration causes NPE + * ++[++FLUME-1280++]++ - Make all config properties of Hbase sinks public constants + * ++[++FLUME-1284++]++ - Need host interceptor for hdfs bucket path escape sequence + * ++[++FLUME-1288++]++ - Async hbase sink should throw exception when hbase reports failure and check hbase table correctness + * ++[++FLUME-1290++]++ - HDFS Sink should accept fileType parameters of arbitrary case + * ++[++FLUME-1297++]++ - Flume tests should wait for a few seconds for agent to start. + * ++[++FLUME-1301++]++ - HDFSCompressedDataStream can lose data + * ++[++FLUME-1303++]++ - java.library.path value is being truncated at first 'n' char + * ++[++FLUME-1304++]++ - Allow for faster allocation of checkpoint file. + * ++[++FLUME-1306++]++ - LoadBalancingRpcClient should catch exception for invalid RpcClient and failover to valid one + * ++[++FLUME-1309++]++ - Integration tests not included in assembly build artifacts + * ++[++FLUME-1312++]++ - Host interceptor should support custom headers + * ++[++FLUME-1314++]++ - File channel log file can grow beyond max size which causes startup failure + * ++[++FLUME-1315++]++ - Null sink should support batching + * ++[++FLUME-1316++]++ - AvroSink should be configurable for connect-timeout and request-timeout + * ++[++FLUME-1317++]++ - Assembly build pulls in target folder from flume-ng-tests + * ++[++FLUME-1319++]++ - File Channel optimize replay of logs when a checkpoint is present + * ++[++FLUME-1320++]++ - Add safeguard for checkpoint corruption detection + * ++[++FLUME-1322++]++ - ChannelProcessor should catch Throwable to work around close() clobbering uncaught Exceptions + * ++[++FLUME-1323++]++ - Remove shutdown hook from FileChannel + * ++[++FLUME-1324++]++ - File Channel Log can contain unassigned blocks + * ++[++FLUME-1325++]++ - Components should be stopped in the reverse order that they were started + * ++[++FLUME-1327++]++ - File Channel can deadlock in when checkpoint happens in between a put/take/commit + * ++[++FLUME-1329++]++ - AvroSink can hang during Avro RPC handshake + * ++[++FLUME-1331++]++ - Start method of components throwing NoClassDefFoundError are not caught + * ++[++FLUME-1333++]++ - Disable running of saveVersion.sh on Windows + * ++[++FLUME-1341++]++ - Build fails on jenkins because a file exists in the environment + * ++[++FLUME-1344++]++ - AvroSink JMX does not report connection created count accurately + * ++[++FLUME-1346++]++ - Build warning from missing maven-sphinx version in reporting section + * ++[++FLUME-1347++]++ - Deprecate RecoverableMemoryChannel + * ++[++FLUME-1348++]++ - Update the documentation, correcting links and removing incubation. + * ++[++FLUME-1349++]++ - Document Hbase sinks. + * ++[++FLUME-1352++]++ - Add documentation for HDFS path rounddown. + * ++[++FLUME-1355++]++ - Improve user guide section about sink processors + * ++[++FLUME-1356++]++ - Document interceptors +++**++ Task:: + * ++[++FLUME-840++]++ - Update project committers in pom file + * ++[++FLUME-991++]++ - Make flume configuration validation component specific at time rather than at runtime + * ++[++FLUME-1028++]++ - Fix jenkins build after addition of submodule + * ++[++FLUME-1050++]++ - Update version of surefire plugin + * ++[++FLUME-1073++]++ - Default Log4j configuration file should have a rolling policy + * ++[++FLUME-1082++]++ - Add User and dev guide to Flume site + * ++[++FLUME-1151++]++ - Exclude docs directory from rat + * ++[++FLUME-1189++]++ - Test ReoverableMemoryChannel throughput versus FileChannel + * ++[++FLUME-1300++]++ - Update user guide for File Channel + * ++[++FLUME-1353++]++ - Ensure license headers are consistent +++**++ Sub-task:: + * ++[++FLUME-748++]++ - Create metric collection infrastructure + * ++[++FLUME-962++]++ - Failover capability for Client SDK + * ++[++FLUME-992++]++ - Create configuration stubs for sources, channels, sinks etc + * ++[++FLUME-999++]++ - Updating init scripts and variables to fit the term agent + * ++[++FLUME-1052++]++ - Core configuration component + * ++[++FLUME-1053++]++ - Basic SourceConfiguration + * ++[++FLUME-1054++]++ - Basic ChannelConfiguration + * ++[++FLUME-1055++]++ - Basic SinkConfiguration + * ++[++FLUME-1105++]++ - Allow the optional disabling of foreign keys + * ++[++FLUME-1107++]++ - Configuration keys for JDBC channel contain redundant prefix. + * ++[++FLUME-1113++]++ - JDBC Channel invokes size query on every put diff --git a/src/site/antora/modules/ROOT/pages/releases/1.3.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.3.0.adoc new file mode 100644 index 0000000000..0b056ba96a --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.3.0.adoc @@ -0,0 +1,200 @@ +//// + 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. +//// + += Version 1.3.0 + +*Status of this release* + +This release is the second release of Apache Flume as an Apache top level project and +is the second release that is considered ready for production use. This release +has has substantially more features and functionality along with bug fixes and other +enhancements. + +*Release Documentation* + +* link:content/1.3.0/FlumeUserGuide.pdf[Flume User Guide] +* link:content/1.3.0/FlumeDeveloperGuide.pdf[Flume Developer Guide] +* link:content/1.3.0/apidocs/index.html[API Documentation] + +*Changes* + +++**++ New Feature:: + * ++[++FLUME-1199++]++ - Add HTTP Post Source + * ++[++FLUME-1371++]++ - ElasticSearch Sink + * ++[++FLUME-1382++]++ - Flume adopt message from existing local Scribe + * ++[++FLUME-1385++]++ - Add a multiport syslog source + * ++[++FLUME-1424++]++ - File Channel should support encryption + * ++[++FLUME-1425++]++ - Create a SpoolDirectory Source and Client + * ++[++FLUME-1488++]++ - Load Balancing RPC client should support exponential backoff of failed nodes + * ++[++FLUME-1537++]++ - Dump RollingFileSink's counter status when agent stops + * ++[++FLUME-1657++]++ - Regex Extractor Interceptor +++**++ Improvement:: + * ++[++FLUME-946++]++ - Allow multiplexing channel selector to specify optional channels. + * ++[++FLUME-1337++]++ - Add IDEA files to .gitignore + * ++[++FLUME-1358++]++ - Add a regex-based filtering interceptor + * ++[++FLUME-1383++]++ - Improve various log messages in FileChannel and HDFSSink + * ++[++FLUME-1408++]++ - ScheduledExecutorService does not log uncaught Throwables, we should log them + * ++[++FLUME-1418++]++ - Improvement for Log4j configuration + * ++[++FLUME-1419++]++ - Using system time if 'timestamp' property is absent in event header + * ++[++FLUME-1434++]++ - Distinguish background worker with channel name + * ++[++FLUME-1480++]++ - Replace object descriptor with detailed component type plus name + * ++[++FLUME-1487++]++ - FileChannel format needs to be extensible + * ++[++FLUME-1490++]++ - Option to limit number of events sent in Stress source + * ++[++FLUME-1496++]++ - TestFileChannel is bloated + * ++[++FLUME-1507++]++ - Have "Topology Design Considerations" in User Guide + * ++[++FLUME-1509++]++ - Flume HDFS sink should allow for the use of different timezones when resolving sink paths + * ++[++FLUME-1519++]++ - LifecycleController prints tons of DEBUG messages + * ++[++FLUME-1523++]++ - Allow -X java opts to be passed to the agent on the command line + * ++[++FLUME-1526++]++ - LogFile log message is scary when no harm has been done + * ++[++FLUME-1531++]++ - Flume User Guide should provide more details on configuring the timestamp interceptor + * ++[++FLUME-1535++]++ - Ability to specify the capacity of MemoryChannel in bytes + * ++[++FLUME-1536++]++ - Support for batch size in StressSource + * ++[++FLUME-1538++]++ - Channels should expose channel fill ratio through JMX + * ++[++FLUME-1543++]++ - TestFileChannel should be factored into many tests + * ++[++FLUME-1546++]++ - File channel encryption: trim() passwords and warn user if he doesn't have JCE policy file + * ++[++FLUME-1548++]++ - Build dies due to older protocol buffers compiler + * ++[++FLUME-1550++]++ - Use maven-antrun-plugin to save version + * ++[++FLUME-1554++]++ - FileChannel fails to build on machines with old protocol buffer compiler + * ++[++FLUME-1556++]++ - It would be nice if NullSink logged the number of event processed every 10K or so + * ++[++FLUME-1560++]++ - TestFileChannel++*++ tests which fill up the channel should use larger batch size than 1 + * ++[++FLUME-1563++]++ - FileChannel Encryption KeyProvider configuration properties should be more consistent + * ++[++FLUME-1564++]++ - FileChannel log file creation could be clarified and tested + * ++[++FLUME-1569++]++ - MemoryChannel uses an Integer as a lock + * ++[++FLUME-1575++]++ - FIleChannel Encryption should disallow a null key + * ++[++FLUME-1603++]++ - FileChannel capacity reached message is unclear + * ++[++FLUME-1607++]++ - FileChannel We should use a regex as opposed to simple filename filter when finding logs + * ++[++FLUME-1609++]++ - FileChannel detecting when the underlying file systems are full could provide cleaner error recovery + * ++[++FLUME-1631++]++ - Retire hdfs.txnEventMax in HDFS sink + * ++[++FLUME-1645++]++ - add hdfs.fileSuffix property to HDFSEventSink + * ++[++FLUME-1660++]++ - Close "idle" hdfs handles + * ++[++FLUME-1675++]++ - Ignore netbeans config files in rat & git + * ++[++FLUME-1681++]++ - Disable empty-file unit test for Spooling File Reader + * ++[++FLUME-1684++]++ - Re-enable empty file unit test + * ++[++FLUME-1689++]++ - BodyTextSerializer should allow an option not to add a newline to each serialized event + * ++[++FLUME-1692++]++ - MultiportSyslogTCPSource user documentation and nickname + * ++[++FLUME-1707++]++ - Update FlumeDevGuide + * ++[++FLUME-1706++]++ - Website for 1.3 fails to build + * ++[++FLUME-1698++]++ - Update RELEASE-NOTES + * ++[++FLUME-1711++]++ - Update Flume User Guide + * ++[++FLUME-1713++]++ - Netcat source should allow for _not_ returning "OK" upon receipt of each message. + * ++[++FLUME-1740++]++ - Remove contrib/ directory from Flume NG + * ++[++FLUME-1750++]++ - File spooling client uses -D as command line option + * ++[++FLUME-1751++]++ - User Guide Examples for File Channel encryption are broken in 1.3 rc5 + * ++[++FLUME-1749++]++ - .gitignore and elipse related files should not be included in source tarball + * ++[++FLUME-1752++]++ - Update CHANGELOG for flume 1.3.0 rc6 to include latest changes +++**++ Bug:: + * ++[++FLUME-1208++]++ - Hbase sink should be built only in Hadoop-1.0 profile + * ++[++FLUME-1256++]++ - OutofMemory erros in Flume build + * ++[++FLUME-1259++]++ - Flume throws OutOfMemory error when sending data from netcat to avro source (negative test case) + * ++[++FLUME-1276++]++ - Create a static header interceptor + * ++[++FLUME-1277++]++ - Error parsing Syslog rfc 3164 messages with null values + * ++[++FLUME-1310++]++ - Make Asynch hbase sink test work with other versions of Hbase + * ++[++FLUME-1354++]++ - Update docs to show that recoverable memory channel is deprecated + * ++[++FLUME-1362++]++ - Port retrying in TestThriftLegacySource not working + * ++[++FLUME-1363++]++ - flume-ng-node - TestNetcatSource doesn't try multiple ports + * ++[++FLUME-1364++]++ - Document the necessity of the timestamp header when using time-related escapes for hdfs sink paths + * ++[++FLUME-1373++]++ - Remove hardcoded file separator in HDFSEventSink + * ++[++FLUME-1374++]++ - Support ganglia reporting + * ++[++FLUME-1376++]++ - StaticInterceptor doc update + * ++[++FLUME-1377++]++ - ChannelProcessor clobbers exception with NPE if Channel.getTransaction() throws + * ++[++FLUME-1389++]++ - Flume gives opaque error if interceptor type not specified + * ++[++FLUME-1391++]++ - Use sync() instead of syncFs() in HDFS Sink to be compatible with hadoop 0.20.2 + * ++[++FLUME-1392++]++ - Inactive channels get added to source channels list causing NPE + * ++[++FLUME-1398++]++ - Improve concurrency for async hbase sink + * ++[++FLUME-1412++]++ - Commons collections is used in file channel - even though it is not in pom.xml + * ++[++FLUME-1414++]++ - VersionInfo should not create a log instance + * ++[++FLUME-1416++]++ - Version Info should have hardcoded git repo address + * ++[++FLUME-1417++]++ - File Channel checkpoint can be bad leading to the channel being unable to start. + * ++[++FLUME-1420++]++ - Exception should be thrown if we cannot instaniate an EventSerializer + * ++[++FLUME-1421++]++ - PollableSourceRunner does not name it's thread + * ++[++FLUME-1422++]++ - Fix "BarSource" Class Signature in Flume Developer Guide + * ++[++FLUME-1426++]++ - FileChannel Replay could be faster + * ++[++FLUME-1428++]++ - File Channel should not consider a file as inactive until all takes are committed. + * ++[++FLUME-1432++]++ - FileChannel should replay logs in the order they were written + * ++[++FLUME-1437++]++ - Checkpoint can miss pending takes. + * ++[++FLUME-1470++]++ - Syslog source does not parse facility correctly + * ++[++FLUME-1479++]++ - Multiple Sinks can connect to single Channel + * ++[++FLUME-1482++]++ - Flume should support exposing metrics via HTTP in JSON/some other web service format. + * ++[++FLUME-1498++]++ - File channel - Log updates and queue updates should be atomic + * ++[++FLUME-1500++]++ - Upgrade flume to use latest version of Avro - v1.7 + * ++[++FLUME-1504++]++ - Test file channel times out randomly + * ++[++FLUME-1506++]++ - Child poms pull in specific versions of packages not in top level pom + * ++[++FLUME-1512++]++ - File Channel should not stop during a checkpoint. + * ++[++FLUME-1513++]++ - File Channel log close() method should not be synchronized + * ++[++FLUME-1514++]++ - Log4jAppender should also have flume-ng-configuration in the pom + * ++[++FLUME-1515++]++ - Fix flume-1.3.0 branch test failures on ASF Jenkins. + * ++[++FLUME-1524++]++ - TestMonitoredCounterGroup is flaky + * ++[++FLUME-1525++]++ - On some (slow) machines TestFileChannel can fail + * ++[++FLUME-1534++]++ - CheckpointRebuilder$ComparableFlumeEventPointer++#++equals does not work correctly. + * ++[++FLUME-1540++]++ - CheckpointBuilder needs to open logfiles in inactive mode + * ++[++FLUME-1541++]++ - Implement a SinkSelector for LoadBalancingSinkProcessor that includes failover mechanics + * ++[++FLUME-1544++]++ - Update dev guide to reflect the protoc requirement + * ++[++FLUME-1545++]++ - File channel missing implicit dependency on commons-lang + * ++[++FLUME-1552++]++ - TestFileChannelEncryption fails without a high encryption policy file + * ++[++FLUME-1553++]++ - TestFileChannelEncryption should be refactored to use TestFileChannelBase + * ++[++FLUME-1555++]++ - StressSource outputs bad log messages that reference (Sequence generator) + * ++[++FLUME-1557++]++ - It would be nice if SequenceGeneratorSource could do batching + * ++[++FLUME-1562++]++ - TestLoadBalancingSinkProcessor.testRoundRobinBackoffFailureRecovery is flaky, fails every once in a while... + * ++[++FLUME-1565++]++ - FileChannel Decryption in RandomReader is not thread safe + * ++[++FLUME-1567++]++ - Avro source should expose the number of active connections through JMX + * ++[++FLUME-1570++]++ - StressSource batching does not work unless maxTotalEvents is specified + * ++[++FLUME-1572++]++ - Add batching to FILE++_++ROLL sink + * ++[++FLUME-1576++]++ - CHECKPOINT++_++INCOMPLETE should be synced to disk before starting the checkpoint. + * ++[++FLUME-1577++]++ - CHECKPOINT++_++INCOMPLETE should be synced to disk before starting the checkpoint. + * ++[++FLUME-1578++]++ - Proposal to modify file channel encryption config + * ++[++FLUME-1582++]++ - flume-ng script should set LD++_++LIBRARY++_++PATH + * ++[++FLUME-1583++]++ - FileChannel fast full replay will always be used if enabled + * ++[++FLUME-1595++]++ - HDFS SequenceFile implementation is not durable due to not using syncFs() + * ++[++FLUME-1606++]++ - Rollbacks of Put transactions does not clear the transaction from inflight puts. + * ++[++FLUME-1610++]++ - HDFSEventSink and bucket writer have a race condition + * ++[++FLUME-1611++]++ - LogUtils regex can be precompiled + * ++[++FLUME-1613++]++ - All of the sink examples in the user guide are broken + * ++[++FLUME-1616++]++ - FileChannel will lose data in when rollback fails with IOException + * ++[++FLUME-1620++]++ - Update flume user guide for LoadBalancingSinkProcessor with the backoff changes. + * ++[++FLUME-1622++]++ - MemoryChannel throws NPE if the event has no body + * ++[++FLUME-1638++]++ - LoadBalancingRpcClient depends on com.google.common.collect.Maps + * ++[++FLUME-1639++]++ - Client SDK should not have dependency on Guava + * ++[++FLUME-1650++]++ - Fix flume-ng-hbase-sink compilation against Hadoop 2.X + * ++[++FLUME-1651++]++ - in the hadoop-0.23 profile HBase version needs to be at least 0.94.2 + * ++[++FLUME-1653++]++ - Update Hadoop-23 profile to point to hadoop-2 alpha artifacts + * ++[++FLUME-1655++]++ - Doc update needed for Regex Filtering Interceptor + * ++[++FLUME-1656++]++ - flume-ng script disregards stderr from hadoop command when finding hadoop jars + * ++[++FLUME-1659++]++ - JSON Handler should return simple events, not JSONEvents. + * ++[++FLUME-1662++]++ - Convert null body in events into zero length arrays. + * ++[++FLUME-1664++]++ - Logutils.getLogs remove unneeded directory check + * ++[++FLUME-1671++]++ - Add support for custom components to MonitoredCounterGroup + * ++[++FLUME-1673++]++ - MonitoredCounterGroup publishes this reference to platform MBean server in constructor + * ++[++FLUME-1683++]++ - Fix Time Granularity Bug in SpoolingFileLineReader + * ++[++FLUME-1690++]++ - Elastic Search Sink doesn't run it's unit tests + * ++[++FLUME-1712++]++ - Regex Extractor Interceptor tests have timezone issues + * ++[++FLUME-1705++]++ - SpoolDirectory short name points at the wrong class + * ++[++FLUME-1719++]++ - Example export command in README do not properly close the string + * ++[++FLUME-1723++]++ - AsyncHBase and Avro bring in different versions of Netty + * ++[++FLUME-1726++]++ - SpoolingFileLineReader must close the reader before renaming + * ++[++FLUME-1743++]++ - Multiport syslog tcp source does not load (v1.3 rc5) +++**++ Test:: + * ++[++FLUME-1492++]++ - Create integration test for file channel +++**++ Task:: + * ++[++FLUME-1359++]++ - Update main pom.xml file with regards to Flume TLP promotion +++**++ Sub-task:: + * ++[++FLUME-897++]++ - Implement write ahead log library + * ++[++FLUME-1629++]++ - Add Audience/Stability annotations + * ++[++FLUME-1694++]++ - Fix LICENSE file for binary artifacts + * ++[++FLUME-1695++]++ - Fix tarball names and directories + * ++[++FLUME-1696++]++ - Update build instructions as Flume build requires more memory + * ++[++FLUME-1697++]++ - Update CHANGELOG after 1.3.0 RC0 + * ++[++FLUME-1727++]++ - Update CHANGELOG for rc4 diff --git a/src/site/antora/modules/ROOT/pages/releases/1.3.1.adoc b/src/site/antora/modules/ROOT/pages/releases/1.3.1.adoc new file mode 100644 index 0000000000..6af9197624 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.3.1.adoc @@ -0,0 +1,49 @@ +//// + 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. +//// + += Version 1.3.1 + +*Status of this release* + +This release is the third release of Apache Flume as an Apache top level project and +is the third release that is considered ready for production use. This release is +primarily a maintenance release for Flume 1.3.0, and includes +several bug fixes and performance enhancements. + +*Release Documentation* + +* link:content/1.3.1/FlumeUserGuide.pdf[Flume User Guide] +* link:content/1.3.1/FlumeDeveloperGuide.pdf[Flume Developer Guide] +* link:content/1.3.1/apidocs/index.html[API Documentation] + +*Changes* + +++**++ Bug:: + * ++[++FLUME-1761++]++ - FileChannel can NPE when log metadata file is empty + * ++[++FLUME-1763++]++ - FileChannel Checkpoints should not be done without free space + * ++[++FLUME-1773++]++ - File Channel worker thread should not be daemon + * ++[++FLUME-1774++]++ - EventBackingStoreFactory error message asks user to delete checkpoint which is now done automatically + * ++[++FLUME-1775++]++ - FileChannel Log Background worker should catch Throwable + * ++[++FLUME-1788++]++ - Flume Thrift source can fail intermittently because of a race condition in Thrift server implementation on some Linux systems + * ++[++FLUME-1789++]++ - Unit tests TestJCEFileKeyProvider and TestFileChannelEncryption fail with IBM JDK and flume-1.3.0 + * ++[++FLUME-1795++]++ - Flume thrift legacy source does not have proper logging configured +++**++ Improvement:: + * ++[++FLUME-1571++]++ - Channels should check for positive capacity and transaction capacity values + * ++[++FLUME-1699++]++ - Make the rename of the meta file platform neutral + * ++[++FLUME-1762++]++ - File Channel should recover automatically if the checkpoint is incomplete or bad by deleting the contents of the checkpoint directory + * ++[++FLUME-1790++]++ - Commands in EncryptionTestUtils comments require high encryption pack to be installed + * ++[++FLUME-1794++]++ - FileChannel check for full disks in the background diff --git a/src/site/antora/modules/ROOT/pages/releases/1.4.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.4.0.adoc new file mode 100644 index 0000000000..768b55464e --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.4.0.adoc @@ -0,0 +1,229 @@ +//// + 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. +//// + += Version 1.4.0 + +*Status of this release* + +Apache Flume 1.4.0 is the fourth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.4.0 is production-ready software. + +*Release Documentation* + +* link:content/1.4.0/FlumeUserGuide.html[Flume 1.4.0 User Guide] (also in link:content/1.4.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.4.0/FlumeDeveloperGuide.html[Flume 1.4.0 Developer Guide] (also in link:content/1.4.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.4.0/apidocs/index.html[Flume 1.4.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.4.0 + +* New Feature +** ++[++https://issues.apache.org/jira/browse/FLUME-924[FLUME-924]++]++ - Implement a JMS source for Flume NG +** ++[++https://issues.apache.org/jira/browse/FLUME-997[FLUME-997]++]++ - Support secure transport mechanism +** ++[++https://issues.apache.org/jira/browse/FLUME-1502[FLUME-1502]++]++ - Support for running simple configurations embedded in host process +** ++[++https://issues.apache.org/jira/browse/FLUME-1516[FLUME-1516]++]++ - FileChannel Write Dual Checkpoints to avoid replays +** ++[++https://issues.apache.org/jira/browse/FLUME-1632[FLUME-1632]++]++ - Persist progress on each file in file spooling client/source +** ++[++https://issues.apache.org/jira/browse/FLUME-1735[FLUME-1735]++]++ - Add support for a plugins.d directory +** ++[++https://issues.apache.org/jira/browse/FLUME-1894[FLUME-1894]++]++ - Implement Thrift RPC +** ++[++https://issues.apache.org/jira/browse/FLUME-1917[FLUME-1917]++]++ - FileChannel group commit (coalesce fsync) +** ++[++https://issues.apache.org/jira/browse/FLUME-2010[FLUME-2010]++]++ - Support Avro records in Log4jAppender and the HDFS Sink +** ++[++https://issues.apache.org/jira/browse/FLUME-2048[FLUME-2048]++]++ - Avro container file deserializer +** ++[++https://issues.apache.org/jira/browse/FLUME-2070[FLUME-2070]++]++ - Add a Flume Morphline Solr Sink +* Improvement +** ++[++https://issues.apache.org/jira/browse/FLUME-1076[FLUME-1076]++]++ - Sink batch sizes vary wildy +** ++[++https://issues.apache.org/jira/browse/FLUME-1100[FLUME-1100]++]++ - HDFSWriterFactory and HDFSFormatterFactory should allow extension +** ++[++https://issues.apache.org/jira/browse/FLUME-1571[FLUME-1571]++]++ - Channels should check for positive capacity and transaction capacity values +** ++[++https://issues.apache.org/jira/browse/FLUME-1586[FLUME-1586]++]++ - File Channel should support verifying integrity of individual events. +** ++[++https://issues.apache.org/jira/browse/FLUME-1652[FLUME-1652]++]++ - Logutils.getLogs could NPE +** ++[++https://issues.apache.org/jira/browse/FLUME-1661[FLUME-1661]++]++ - ExecSource cannot execute complex Unix commands +** ++[++https://issues.apache.org/jira/browse/FLUME-1677[FLUME-1677]++]++ - Add File-channel dependency to flume-ng-node's pom.xml +** ++[++https://issues.apache.org/jira/browse/FLUME-1699[FLUME-1699]++]++ - Make the rename of the meta file platform neutral +** ++[++https://issues.apache.org/jira/browse/FLUME-1702[FLUME-1702]++]++ - HDFSEventSink should write to a hidden file as opposed to a .tmp file +** ++[++https://issues.apache.org/jira/browse/FLUME-1740[FLUME-1740]++]++ - Remove contrib/ directory from Flume NG +** ++[++https://issues.apache.org/jira/browse/FLUME-1745[FLUME-1745]++]++ - FlumeConfiguration Eats Exceptions +** ++[++https://issues.apache.org/jira/browse/FLUME-1756[FLUME-1756]++]++ - Avro client should be able to use load balancing RPC +** ++[++https://issues.apache.org/jira/browse/FLUME-1757[FLUME-1757]++]++ - Improve configuration of hbase serializers +** ++[++https://issues.apache.org/jira/browse/FLUME-1762[FLUME-1762]++]++ - File Channel should recover automatically if the checkpoint is incomplete or bad by deleting the contents of the checkpoint directory +** ++[++https://issues.apache.org/jira/browse/FLUME-1768[FLUME-1768]++]++ - Multiplexing channel selector should allow optional-only channels +** ++[++https://issues.apache.org/jira/browse/FLUME-1769[FLUME-1769]++]++ - Replicating channel selector should support optional channels +** ++[++https://issues.apache.org/jira/browse/FLUME-1770[FLUME-1770]++]++ - Flume should have serializer which supports serializer the headers to a simple string +** ++[++https://issues.apache.org/jira/browse/FLUME-1777[FLUME-1777]++]++ - AbstractSource does not provide enough implementation for sub-classes +** ++[++https://issues.apache.org/jira/browse/FLUME-1790[FLUME-1790]++]++ - Commands in EncryptionTestUtils comments require high encryption pack to be installed +** ++[++https://issues.apache.org/jira/browse/FLUME-1794[FLUME-1794]++]++ - FileChannel check for full disks in the background +** ++[++https://issues.apache.org/jira/browse/FLUME-1800[FLUME-1800]++]++ - Docs for spooling source durability changes +** ++[++https://issues.apache.org/jira/browse/FLUME-1808[FLUME-1808]++]++ - ElasticSearchSink is missing log4.properties +** ++[++https://issues.apache.org/jira/browse/FLUME-1821[FLUME-1821]++]++ - Support configuration of hbase instances to be used in AsyncHBaseSink from flume config +** ++[++https://issues.apache.org/jira/browse/FLUME-1847[FLUME-1847]++]++ - NPE in SourceConfiguration +** ++[++https://issues.apache.org/jira/browse/FLUME-1848[FLUME-1848]++]++ - HDFSDataStream logger is actually for a sequence file +** ++[++https://issues.apache.org/jira/browse/FLUME-1855[FLUME-1855]++]++ - Sequence gen source should be able to stop after a fixed number of events +** ++[++https://issues.apache.org/jira/browse/FLUME-1864[FLUME-1864]++]++ - Allow hdfs idle callback to clean up closed bucket writers +** ++[++https://issues.apache.org/jira/browse/FLUME-1874[FLUME-1874]++]++ - Ship with log4j.properties file that has a reliable time based rolling policy +** ++[++https://issues.apache.org/jira/browse/FLUME-1876[FLUME-1876]++]++ - Document hadoop dependency of FileChannel when used with EmbeddedAgent +** ++[++https://issues.apache.org/jira/browse/FLUME-1878[FLUME-1878]++]++ - FileChannel replay should print status every 10000 events +** ++[++https://issues.apache.org/jira/browse/FLUME-1886[FLUME-1886]++]++ - Add a JMS enum type to SourceType so that users don't need to enter FQCN for JMSSource +** ++[++https://issues.apache.org/jira/browse/FLUME-1889[FLUME-1889]++]++ - Add HBASE and ASYNC++_++HBASE enum types to SinkType so that users don't need to enter FQCNs +** ++[++https://issues.apache.org/jira/browse/FLUME-1906[FLUME-1906]++]++ - Ability to disable WAL for put operation in HBaseSink +** ++[++https://issues.apache.org/jira/browse/FLUME-1915[FLUME-1915]++]++ - Enhance NettyAvroRpcClient and the use of NettyServer to optionally use compression +** ++[++https://issues.apache.org/jira/browse/FLUME-1926[FLUME-1926]++]++ - Optionally timeout Avro Sink Rpc Clients to avoid stickiness +** ++[++https://issues.apache.org/jira/browse/FLUME-1940[FLUME-1940]++]++ - Log a snapshot of Flume metrics on shutdown +** ++[++https://issues.apache.org/jira/browse/FLUME-1945[FLUME-1945]++]++ - HBase Serializer allow key from regular expression group +** ++[++https://issues.apache.org/jira/browse/FLUME-1976[FLUME-1976]++]++ - JMS Source document should provide instruction on JMS implementation jars +** ++[++https://issues.apache.org/jira/browse/FLUME-1977[FLUME-1977]++]++ - JMS Source connectionFactory property is not documented +** ++[++https://issues.apache.org/jira/browse/FLUME-1992[FLUME-1992]++]++ - ElasticSearch dependency is marked optional +** ++[++https://issues.apache.org/jira/browse/FLUME-1994[FLUME-1994]++]++ - Add ELASTICSEARCH enum type to SinkType to eliminate need for FQCN in agent configuration files +** ++[++https://issues.apache.org/jira/browse/FLUME-2004[FLUME-2004]++]++ - Need to capture metrics on the Flume exec source such as events received, rejected, etc. +** ++[++https://issues.apache.org/jira/browse/FLUME-2005[FLUME-2005]++]++ - Minor improvements to Flume assembly config +** ++[++https://issues.apache.org/jira/browse/FLUME-2008[FLUME-2008]++]++ - it would be very convenient to have a fat jar of flume-ng-log4jappender +** ++[++https://issues.apache.org/jira/browse/FLUME-2009[FLUME-2009]++]++ - Flume project throws error when imported into Eclipse IDE (Juno) +** ++[++https://issues.apache.org/jira/browse/FLUME-2013[FLUME-2013]++]++ - Parametrize java source and target version in the main pom file +** ++[++https://issues.apache.org/jira/browse/FLUME-2015[FLUME-2015]++]++ - ElasticSearchSink: need access to IndexRequestBuilder instance during flume event processing +** ++[++https://issues.apache.org/jira/browse/FLUME-2046[FLUME-2046]++]++ - Typo in HBaseSink java doc +** ++[++https://issues.apache.org/jira/browse/FLUME-2049[FLUME-2049]++]++ - Compile ElasticSearchSink with elasticsearch 0.90 +** ++[++https://issues.apache.org/jira/browse/FLUME-2062[FLUME-2062]++]++ - make it possible for HBase sink to deposit event headers into corresponding column qualifiers +** ++[++https://issues.apache.org/jira/browse/FLUME-2063[FLUME-2063]++]++ - Add Configurable charset to RegexHbaseEventSerializer +** ++[++https://issues.apache.org/jira/browse/FLUME-2076[FLUME-2076]++]++ - JMX metrics support for HTTP Source +** ++[++https://issues.apache.org/jira/browse/FLUME-2093[FLUME-2093]++]++ - binary tarball that is created by flume's assembly shouldn't contain sources +** ++[++https://issues.apache.org/jira/browse/FLUME-2100[FLUME-2100]++]++ - Increase default batchSize of Morphline Solr Sink +** ++[++https://issues.apache.org/jira/browse/FLUME-2105[FLUME-2105]++]++ - Add docs for MorphlineSolrSink +* Bug +** ++[++https://issues.apache.org/jira/browse/FLUME-1110[FLUME-1110]++]++ - HDFS Sink throws IllegalStateException when flume-daemon shuts down +** ++[++https://issues.apache.org/jira/browse/FLUME-1153[FLUME-1153]++]++ - flume-ng script is missing some agent options in help output +** ++[++https://issues.apache.org/jira/browse/FLUME-1175[FLUME-1175]++]++ - RollingFileSink complains of Bad File Descriptor upon a reconfig event +** ++[++https://issues.apache.org/jira/browse/FLUME-1262[FLUME-1262]++]++ - Move doc generation to a different profile +** ++[++https://issues.apache.org/jira/browse/FLUME-1285[FLUME-1285]++]++ - FileChannel has a dependency on Hadoop IO classes +** ++[++https://issues.apache.org/jira/browse/FLUME-1296[FLUME-1296]++]++ - Lifecycle supervisor should check if the monitor service is still running before supervising +** ++[++https://issues.apache.org/jira/browse/FLUME-1511[FLUME-1511]++]++ - Scribe-source doesn't handle zero message request correctly. +** ++[++https://issues.apache.org/jira/browse/FLUME-1676[FLUME-1676]++]++ - ExecSource should provide a configurable charset +** ++[++https://issues.apache.org/jira/browse/FLUME-1688[FLUME-1688]++]++ - Bump AsyncHBase version to 1.4.1 +** ++[++https://issues.apache.org/jira/browse/FLUME-1709[FLUME-1709]++]++ - HDFS CompressedDataStream doesn't support serializer parameter +** ++[++https://issues.apache.org/jira/browse/FLUME-1720[FLUME-1720]++]++ - LICENSE file contain entry for protobuf-++<++version++>++.jar, however proper artifact name is protobuf-java-++<++version++>++.jar +** ++[++https://issues.apache.org/jira/browse/FLUME-1731[FLUME-1731]++]++ - SpoolableDirectorySource should have configurable support for deleting files it has already completed instead of renaming +** ++[++https://issues.apache.org/jira/browse/FLUME-1741[FLUME-1741]++]++ - ElasticSearch tests leave directory data/elasticsearch/nodes/ lying around +** ++[++https://issues.apache.org/jira/browse/FLUME-1748[FLUME-1748]++]++ - HDFS Sink should check if the thread is interrupted before performing any HDFS operations +** ++[++https://issues.apache.org/jira/browse/FLUME-1755[FLUME-1755]++]++ - Load balancing RPC client has issues with downed hosts +** ++[++https://issues.apache.org/jira/browse/FLUME-1766[FLUME-1766]++]++ - AvroSource throws confusing exception when configured without a port +** ++[++https://issues.apache.org/jira/browse/FLUME-1772[FLUME-1772]++]++ - AbstractConfigurationProvider should remove component which throws exception from configure method. +** ++[++https://issues.apache.org/jira/browse/FLUME-1773[FLUME-1773]++]++ - File Channel worker thread should not be daemon +** ++[++https://issues.apache.org/jira/browse/FLUME-1774[FLUME-1774]++]++ - EventBackingStoreFactory error message asks user to delete checkpoint which is now done automatically +** ++[++https://issues.apache.org/jira/browse/FLUME-1775[FLUME-1775]++]++ - FileChannel Log Background worker should catch Throwable +** ++[++https://issues.apache.org/jira/browse/FLUME-1776[FLUME-1776]++]++ - Several modules require commons-lang but do not declare this in the pom +** ++[++https://issues.apache.org/jira/browse/FLUME-1778[FLUME-1778]++]++ - Upgrade Flume to use Avro 1.7.3 +** ++[++https://issues.apache.org/jira/browse/FLUME-1784[FLUME-1784]++]++ - JMSource fix minor documentation problem and parameter name +** ++[++https://issues.apache.org/jira/browse/FLUME-1788[FLUME-1788]++]++ - Flume Thrift source can fail intermittently because of a race condition in Thrift server implementation on some Linux systems +** ++[++https://issues.apache.org/jira/browse/FLUME-1789[FLUME-1789]++]++ - Unit tests TestJCEFileKeyProvider and TestFileChannelEncryption fail with IBM JDK and flume-1.3.0 +** ++[++https://issues.apache.org/jira/browse/FLUME-1795[FLUME-1795]++]++ - Flume thrift legacy source does not have proper logging configured +** ++[++https://issues.apache.org/jira/browse/FLUME-1797[FLUME-1797]++]++ - TestFlumeConfiguration is in com.apache.flume.conf namespace. +** ++[++https://issues.apache.org/jira/browse/FLUME-1799[FLUME-1799]++]++ - Generated source tarball is missing flume-ng-embedded-agent +** ++[++https://issues.apache.org/jira/browse/FLUME-1802[FLUME-1802]++]++ - Missing parameter --conf in example of the Flume User Guide +** ++[++https://issues.apache.org/jira/browse/FLUME-1803[FLUME-1803]++]++ - Generated dist tarball is missing flume-ng-embedded-agent +** ++[++https://issues.apache.org/jira/browse/FLUME-1804[FLUME-1804]++]++ - JMS source not included in binary dist +** ++[++https://issues.apache.org/jira/browse/FLUME-1805[FLUME-1805]++]++ - Embedded agent deps should be specified in dependencyManagement section of pom +** ++[++https://issues.apache.org/jira/browse/FLUME-1818[FLUME-1818]++]++ - Support various layouts in log4jappender +** ++[++https://issues.apache.org/jira/browse/FLUME-1819[FLUME-1819]++]++ - ExecSource don't flush the cache if there is no input entries +** ++[++https://issues.apache.org/jira/browse/FLUME-1820[FLUME-1820]++]++ - Should not be possible for RPC client to block indefinitely on close() +** ++[++https://issues.apache.org/jira/browse/FLUME-1822[FLUME-1822]++]++ - Update javadoc for FlumeConfiguration +** ++[++https://issues.apache.org/jira/browse/FLUME-1823[FLUME-1823]++]++ - LoadBalancingRpcClient method must throw exception if it is called after close is called. +** ++[++https://issues.apache.org/jira/browse/FLUME-1824[FLUME-1824]++]++ - Inflights can complete successfully even if checkpoint fails +** ++[++https://issues.apache.org/jira/browse/FLUME-1828[FLUME-1828]++]++ - ResettableInputStream should support seek() +** ++[++https://issues.apache.org/jira/browse/FLUME-1834[FLUME-1834]++]++ - Userguide on trunk is missing some memory channel props +** ++[++https://issues.apache.org/jira/browse/FLUME-1835[FLUME-1835]++]++ - Flume User Guide has wrong prop in Load Balancing Sink Selector +** ++[++https://issues.apache.org/jira/browse/FLUME-1844[FLUME-1844]++]++ - HDFSEventSink should have option to use RawLocalFileSystem +** ++[++https://issues.apache.org/jira/browse/FLUME-1845[FLUME-1845]++]++ - Document plugin.d directory structure +** ++[++https://issues.apache.org/jira/browse/FLUME-1849[FLUME-1849]++]++ - Embedded Agent doesn't shutdown supervisor +** ++[++https://issues.apache.org/jira/browse/FLUME-1852[FLUME-1852]++]++ - Issues with EmbeddedAgentConfiguration +** ++[++https://issues.apache.org/jira/browse/FLUME-1854[FLUME-1854]++]++ - Application class can deadlock if stopped immediately after start +** ++[++https://issues.apache.org/jira/browse/FLUME-1863[FLUME-1863]++]++ - EmbeddedAgent pom must pull in file channel +** ++[++https://issues.apache.org/jira/browse/FLUME-1865[FLUME-1865]++]++ - Rename the Sequence File formatters to Serializer to be consistent with the rest of Flume +** ++[++https://issues.apache.org/jira/browse/FLUME-1866[FLUME-1866]++]++ - ChannelProcessor is not logging ChannelExceptions. +** ++[++https://issues.apache.org/jira/browse/FLUME-1867[FLUME-1867]++]++ - There's no option to set hostname for HTTPSource +** ++[++https://issues.apache.org/jira/browse/FLUME-1868[FLUME-1868]++]++ - FlumeUserGuide mentions wrong FQCN for JSONHandler +** ++[++https://issues.apache.org/jira/browse/FLUME-1869[FLUME-1869]++]++ - Request to add "HTTP" source type to SourceType.java +** ++[++https://issues.apache.org/jira/browse/FLUME-1870[FLUME-1870]++]++ - Flume sends non-numeric values with type as float to Ganglia causing ganglia to crash +** ++[++https://issues.apache.org/jira/browse/FLUME-1872[FLUME-1872]++]++ - SpoolingDirectorySource doesn't delete tracker file when deletePolicy is "immediate" +** ++[++https://issues.apache.org/jira/browse/FLUME-1879[FLUME-1879]++]++ - Secure HBase documentation +** ++[++https://issues.apache.org/jira/browse/FLUME-1880[FLUME-1880]++]++ - Double-logging of created HDFS files +** ++[++https://issues.apache.org/jira/browse/FLUME-1882[FLUME-1882]++]++ - Allow case-insensitive deserializer value for SpoolDirectorySource +** ++[++https://issues.apache.org/jira/browse/FLUME-1890[FLUME-1890]++]++ - Flume should set the hbase keytab and principal in HBase conf object. +** ++[++https://issues.apache.org/jira/browse/FLUME-1891[FLUME-1891]++]++ - Fast replay runs even when checkpoint exists. +** ++[++https://issues.apache.org/jira/browse/FLUME-1893[FLUME-1893]++]++ - File Channel could miss possible checkpoint corruption +** ++[++https://issues.apache.org/jira/browse/FLUME-1911[FLUME-1911]++]++ - Add deprecation back to the legacy thrift code +** ++[++https://issues.apache.org/jira/browse/FLUME-1916[FLUME-1916]++]++ - HDFS sink should poll for ++#++ of active replicas. If less than required, roll the file. +** ++[++https://issues.apache.org/jira/browse/FLUME-1918[FLUME-1918]++]++ - File Channel cannot handle capacity of more than 500 Million events +** ++[++https://issues.apache.org/jira/browse/FLUME-1922[FLUME-1922]++]++ - HDFS Sink should optionally insert the timestamp at the sink +** ++[++https://issues.apache.org/jira/browse/FLUME-1924[FLUME-1924]++]++ - Bug in serializer context parsing in RollingFileSink +** ++[++https://issues.apache.org/jira/browse/FLUME-1925[FLUME-1925]++]++ - HDFS timeouts should not starve other threads +** ++[++https://issues.apache.org/jira/browse/FLUME-1929[FLUME-1929]++]++ - CheckpointRebuilder main method does not work +** ++[++https://issues.apache.org/jira/browse/FLUME-1930[FLUME-1930]++]++ - Inflights should clean up executors on close. +** ++[++https://issues.apache.org/jira/browse/FLUME-1931[FLUME-1931]++]++ - HDFS Sink has a commons-lang dependency which is missing in pom +** ++[++https://issues.apache.org/jira/browse/FLUME-1932[FLUME-1932]++]++ - no-reload-conf command line param does not work +** ++[++https://issues.apache.org/jira/browse/FLUME-1937[FLUME-1937]++]++ - Issue with maxUnderReplication in HDFS sink +** ++[++https://issues.apache.org/jira/browse/FLUME-1939[FLUME-1939]++]++ - FlumeEventQueue must check if file is open before setting the length of the file +** ++[++https://issues.apache.org/jira/browse/FLUME-1943[FLUME-1943]++]++ - ExecSource tests failing on Jenkins +** ++[++https://issues.apache.org/jira/browse/FLUME-1948[FLUME-1948]++]++ - plugins.d directory(ies) should be separately overridable, independent of FLUME++_++HOME +** ++[++https://issues.apache.org/jira/browse/FLUME-1949[FLUME-1949]++]++ - Documentation for sink processor lists incorrect default +** ++[++https://issues.apache.org/jira/browse/FLUME-1955[FLUME-1955]++]++ - fileSuffix does not work with compressed streams +** ++[++https://issues.apache.org/jira/browse/FLUME-1958[FLUME-1958]++]++ - Remove attlasian-ide-plugin.xml from the repo +** ++[++https://issues.apache.org/jira/browse/FLUME-1964[FLUME-1964]++]++ - hdfs sink depends on commons-io but does not specify it in the pom +** ++[++https://issues.apache.org/jira/browse/FLUME-1965[FLUME-1965]++]++ - Thrift sink alias doesn't exist +** ++[++https://issues.apache.org/jira/browse/FLUME-1969[FLUME-1969]++]++ - Update user Guide to explain the purpose of minimumRequiredSpace setting for FileChannel +** ++[++https://issues.apache.org/jira/browse/FLUME-1974[FLUME-1974]++]++ - Thrift compatibility issue with hbase-0.92 +** ++[++https://issues.apache.org/jira/browse/FLUME-1975[FLUME-1975]++]++ - Use TThreadedSelectServer in ThriftSource if it is available +** ++[++https://issues.apache.org/jira/browse/FLUME-1980[FLUME-1980]++]++ - Log4jAppender should optionally drop events if append fails +** ++[++https://issues.apache.org/jira/browse/FLUME-1981[FLUME-1981]++]++ - Rpc client expiration can be done in a more thread-safe way +** ++[++https://issues.apache.org/jira/browse/FLUME-1986[FLUME-1986]++]++ - doTestInflightCorrupts should not commit transactions +** ++[++https://issues.apache.org/jira/browse/FLUME-1993[FLUME-1993]++]++ - On Windows, when using the spooling directory source, there is a file sharing violation when trying to delete tracker file +** ++[++https://issues.apache.org/jira/browse/FLUME-2002[FLUME-2002]++]++ - Flume RPC Client creates 2 threads per each log attempt if the remote flume agent goes down +** ++[++https://issues.apache.org/jira/browse/FLUME-2011[FLUME-2011]++]++ - "mvn test" fails +** ++[++https://issues.apache.org/jira/browse/FLUME-2012[FLUME-2012]++]++ - Two tests fail on Mac OS (saying they fail to load native library) with Java 7 +** ++[++https://issues.apache.org/jira/browse/FLUME-2014[FLUME-2014]++]++ - Race condition when using local timestamp with BucketPath +** ++[++https://issues.apache.org/jira/browse/FLUME-2023[FLUME-2023]++]++ - Flume must login to secure HBase before creating the HTable instance +** ++[++https://issues.apache.org/jira/browse/FLUME-2025[FLUME-2025]++]++ - ThriftSource throws NPE in stop() if start() failed because socket open failed or if thrift server instance creation threw. +** ++[++https://issues.apache.org/jira/browse/FLUME-2026[FLUME-2026]++]++ - TestHTTPSource should use any available port rather than a hardcoded port number +** ++[++https://issues.apache.org/jira/browse/FLUME-2027[FLUME-2027]++]++ - Check for default replication fails on federated cluster in hdfs sink +** ++[++https://issues.apache.org/jira/browse/FLUME-2032[FLUME-2032]++]++ - HDFSEventSink doesn't work in Windows +** ++[++https://issues.apache.org/jira/browse/FLUME-2036[FLUME-2036]++]++ - Make hostname optional for HTTPSource +** ++[++https://issues.apache.org/jira/browse/FLUME-2042[FLUME-2042]++]++ - log4jappender timeout should be configurable +** ++[++https://issues.apache.org/jira/browse/FLUME-2043[FLUME-2043]++]++ - JMS Source removed on failure to create configuration +** ++[++https://issues.apache.org/jira/browse/FLUME-2044[FLUME-2044]++]++ - HDFS Sink impersonation fails after the first file +** ++[++https://issues.apache.org/jira/browse/FLUME-2051[FLUME-2051]++]++ - Surefire 2.12 cannot run a single test on Windows. Upgrade to 2.12.3 +** ++[++https://issues.apache.org/jira/browse/FLUME-2054[FLUME-2054]++]++ - Support Version Info on Windows and fix failure of TestVersionInfo +** ++[++https://issues.apache.org/jira/browse/FLUME-2057[FLUME-2057]++]++ - Failures in FileChannel's TestEventQueueBackingStoreFactory on Windows +** ++[++https://issues.apache.org/jira/browse/FLUME-2060[FLUME-2060]++]++ - Failure in TestLog.testReplaySucceedsWithUnusedEmptyLogMetaDataFastReplay test on Windows +** ++[++https://issues.apache.org/jira/browse/FLUME-2072[FLUME-2072]++]++ - JMX metrics support for HBase Sink +** ++[++https://issues.apache.org/jira/browse/FLUME-2081[FLUME-2081]++]++ - JMX metrics support for SpoolDir +** ++[++https://issues.apache.org/jira/browse/FLUME-2082[FLUME-2082]++]++ - JMX support for Seq Generator Source +** ++[++https://issues.apache.org/jira/browse/FLUME-2083[FLUME-2083]++]++ - Avro Source should not start if SSL is enabled and keystore cannot be opened +** ++[++https://issues.apache.org/jira/browse/FLUME-2098[FLUME-2098]++]++ - Make Solr sink depend on the CDK version of morphlines +* Documentation +** ++[++https://issues.apache.org/jira/browse/FLUME-1621[FLUME-1621]++]++ - Document new MemoryChannel parameters in Flume User Guide +** ++[++https://issues.apache.org/jira/browse/FLUME-1910[FLUME-1910]++]++ - Add thrift RPC documentation +** ++[++https://issues.apache.org/jira/browse/FLUME-1953[FLUME-1953]++]++ - Fix dev guide error that says sink can read from multiple channels +** ++[++https://issues.apache.org/jira/browse/FLUME-1962[FLUME-1962]++]++ - Document proper specification of lzo codec as lzop in Flume User Guide +** ++[++https://issues.apache.org/jira/browse/FLUME-1979[FLUME-1979]++]++ - Wrong propname for connection reset interval in avro sink +** ++[++https://issues.apache.org/jira/browse/FLUME-2030[FLUME-2030]++]++ - Documentation of Configuration Changes JMSSource, HBaseSink, AsyncHBaseSink and ElasticSearchSink +* Task +** ++[++https://issues.apache.org/jira/browse/FLUME-1686[FLUME-1686]++]++ - Exclude target directories & Eclipse files from rat checks +** ++[++https://issues.apache.org/jira/browse/FLUME-2094[FLUME-2094]++]++ - Remove the deprecated - Recoverable Memory Channel +* Sub-task +** ++[++https://issues.apache.org/jira/browse/FLUME-1626[FLUME-1626]++]++ - Support Hbase security in Hbase sink +** ++[++https://issues.apache.org/jira/browse/FLUME-1630[FLUME-1630]++]++ - Flume configuration code could be improved +** ++[++https://issues.apache.org/jira/browse/FLUME-1674[FLUME-1674]++]++ - Documentation / Wiki +** ++[++https://issues.apache.org/jira/browse/FLUME-1896[FLUME-1896]++]++ - Implement Thrift RpcClient +** ++[++https://issues.apache.org/jira/browse/FLUME-1897[FLUME-1897]++]++ - Implement Thrift Sink +** ++[++https://issues.apache.org/jira/browse/FLUME-1898[FLUME-1898]++]++ - Implement Thrift Source +** ++[++https://issues.apache.org/jira/browse/FLUME-2102[FLUME-2102]++]++ - Update LICENSE file for Flume 1.4.0 diff --git a/src/site/antora/modules/ROOT/pages/releases/1.5.0.1.adoc b/src/site/antora/modules/ROOT/pages/releases/1.5.0.1.adoc new file mode 100644 index 0000000000..9c891417d6 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.5.0.1.adoc @@ -0,0 +1,38 @@ +//// + 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. +//// + += Version 1.5.0.1 + +*Status of this release* + +Apache Flume 1.5.0.1 is the sixth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.5.0.1 is production-ready software. + +*Release Documentation* + +* link:content/1.5.0.1/FlumeUserGuide.html[Flume 1.5.0.1 User Guide] (also in link:content/1.5.0.1/FlumeUserGuide.pdf[pdf]) +* link:content/1.5.0.1/FlumeDeveloperGuide.html[Flume 1.5.0.1 Developer Guide] (also in link:content/1.5.0.1/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.5.0.1/apidocs/index.html[Flume 1.5.0.1 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.5.0.1 + +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2389[FLUME-2389]++]++ - Spillable Memory Channel Example is incorrect + * ++[++https://issues.apache.org/jira/browse/FLUME-2397[FLUME-2397]++]++ - HBase-98 compatibility + * ++[++https://issues.apache.org/jira/browse/FLUME-2400[FLUME-2400]++]++ - Dataset Sink is not built in hbase-98 profile diff --git a/src/site/antora/modules/ROOT/pages/releases/1.5.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.5.0.adoc new file mode 100644 index 0000000000..a3b9c5f19a --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.5.0.adoc @@ -0,0 +1,161 @@ +//// + 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. +//// + += Version 1.5.0 + +*Status of this release* + +Apache Flume 1.5.0 is the fifth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.5.0 is production-ready software. + +*Release Documentation* + +* link:content/1.5.0/FlumeUserGuide.html[Flume 1.5.0 User Guide] (also in link:content/1.5.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.5.0/FlumeDeveloperGuide.html[Flume 1.5.0 Developer Guide] (also in link:content/1.5.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.5.0/apidocs/index.html[Flume 1.5.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.5.0 + +++**++ New Feature:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1227[FLUME-1227]++]++ - Introduce some sort of SpillableChannel + * ++[++https://issues.apache.org/jira/browse/FLUME-2056[FLUME-2056]++]++ - Allow SpoolDir to pass just the filename that is the source of an event + * ++[++https://issues.apache.org/jira/browse/FLUME-2071[FLUME-2071]++]++ - Flume Context doesn't support float or double configuration values. + * ++[++https://issues.apache.org/jira/browse/FLUME-2185[FLUME-2185]++]++ - Upgrade morphlines to 0.7.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2188[FLUME-2188]++]++ - flume-ng-log4jappender Support user supplied headers + * ++[++https://issues.apache.org/jira/browse/FLUME-2225[FLUME-2225]++]++ - Elasticsearch Sink for ES HTTP API + * ++[++https://issues.apache.org/jira/browse/FLUME-2294[FLUME-2294]++]++ - Add a sink for Kite Datasets + * ++[++https://issues.apache.org/jira/browse/FLUME-2309[FLUME-2309]++]++ - Spooling directory should not always consume the oldest file first. +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1542[FLUME-1542]++]++ - Flume User Guide sample configurations need fixing + * ++[++https://issues.apache.org/jira/browse/FLUME-1899[FLUME-1899]++]++ - Make SpoolDir work with Sub-Directories + * ++[++https://issues.apache.org/jira/browse/FLUME-2052[FLUME-2052]++]++ - Spooling directory source should be able to replace or ignore malformed characters + * ++[++https://issues.apache.org/jira/browse/FLUME-2130[FLUME-2130]++]++ - Handle larger payloads via SyslogUDPSource + * ++[++https://issues.apache.org/jira/browse/FLUME-2139[FLUME-2139]++]++ - upgrade morphline library dependency to a 0.5.0 release + * ++[++https://issues.apache.org/jira/browse/FLUME-2154[FLUME-2154]++]++ - Reducing duplicate events caused by reset-connection-interval + * ++[++https://issues.apache.org/jira/browse/FLUME-2155[FLUME-2155]++]++ - Improve replay time + * ++[++https://issues.apache.org/jira/browse/FLUME-2181[FLUME-2181]++]++ - Optionally disable File Channel fsyncs + * ++[++https://issues.apache.org/jira/browse/FLUME-2202[FLUME-2202]++]++ - AsyncHBaseSink should coalesce increments to reduce RPC roundtrips + * ++[++https://issues.apache.org/jira/browse/FLUME-2206[FLUME-2206]++]++ - ElasticSearchSink ttl field modification to mimic Elasticsearch way of specifying TTL + * ++[++https://issues.apache.org/jira/browse/FLUME-2207[FLUME-2207]++]++ - HDFS file suffix style index suffix in ElasticSearchSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2212[FLUME-2212]++]++ - upgrade to Morphlines-0.8.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2213[FLUME-2213]++]++ - MorphlineInterceptor should share metric registry across threads for better (aggregate) reporting + * ++[++https://issues.apache.org/jira/browse/FLUME-2217[FLUME-2217]++]++ - Preserve priority, timestamp and hostname fields in MultiportSyslogTcp and Udp sources + * ++[++https://issues.apache.org/jira/browse/FLUME-2231[FLUME-2231]++]++ - Add details in Flume Ganglia config in User Guide + * ++[++https://issues.apache.org/jira/browse/FLUME-2243[FLUME-2243]++]++ - AvroSource to use TransceiverThreadFactory for Thread naming while initializing NioServerSocketChannelFactory + * ++[++https://issues.apache.org/jira/browse/FLUME-2267[FLUME-2267]++]++ - Increase default transactionCapacity for FileChannel to 10000 from 1000 + * ++[++https://issues.apache.org/jira/browse/FLUME-2275[FLUME-2275]++]++ - Improve scalability of MorphlineInterceptor under contention + * ++[++https://issues.apache.org/jira/browse/FLUME-2292[FLUME-2292]++]++ - Upgrade mapdb to 0.9.8 + * ++[++https://issues.apache.org/jira/browse/FLUME-2316[FLUME-2316]++]++ - Upgrade MorphlineSolrSink to kite-0.12.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2340[FLUME-2340]++]++ - Refactor to make room for Morphlines Elasticsearch Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2343[FLUME-2343]++]++ - Add user impersonation to DatasetSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2351[FLUME-2351]++]++ - Ability to override any parameter from the configuration file + * ++[++https://issues.apache.org/jira/browse/FLUME-2352[FLUME-2352]++]++ - HDFSCompressedDataStream should support appendBatch +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1666[FLUME-1666]++]++ - Syslog source strips timestamp and hostname from log message body + * ++[++https://issues.apache.org/jira/browse/FLUME-1679[FLUME-1679]++]++ - Add dependency on Guava to flume-ng-elasticsearch-sink POM + * ++[++https://issues.apache.org/jira/browse/FLUME-1892[FLUME-1892]++]++ - IRC Sink NPE + * ++[++https://issues.apache.org/jira/browse/FLUME-1951[FLUME-1951]++]++ - Remove unused future from FlumeEventQueue + * ++[++https://issues.apache.org/jira/browse/FLUME-2007[FLUME-2007]++]++ - HDFS Sink should check if file is closed and retry if it is not. + * ++[++https://issues.apache.org/jira/browse/FLUME-2088[FLUME-2088]++]++ - Minor typo in Flume User Guide JSON Reporting section + * ++[++https://issues.apache.org/jira/browse/FLUME-2109[FLUME-2109]++]++ - HTTPS support in HTTP Source + * ++[++https://issues.apache.org/jira/browse/FLUME-2110[FLUME-2110]++]++ - Scribe Source must check if category is null before inserting the headers + * ++[++https://issues.apache.org/jira/browse/FLUME-2119[FLUME-2119]++]++ - duplicate files cause flume to enter irrecoverable state + * ++[++https://issues.apache.org/jira/browse/FLUME-2121[FLUME-2121]++]++ - Upgrade Flume to log4j 1.2.17 to be in sync with HDFS/HBase + * ++[++https://issues.apache.org/jira/browse/FLUME-2122[FLUME-2122]++]++ - Minor cleanups of User guide + * ++[++https://issues.apache.org/jira/browse/FLUME-2123[FLUME-2123]++]++ - Morphline Solr sink missing short type name + * ++[++https://issues.apache.org/jira/browse/FLUME-2124[FLUME-2124]++]++ - Upgrade Morphline Solr Sink to CDK 0.4.1 + * ++[++https://issues.apache.org/jira/browse/FLUME-2127[FLUME-2127]++]++ - JMX shutdown command for Flume + * ++[++https://issues.apache.org/jira/browse/FLUME-2134[FLUME-2134]++]++ - AsyncHbase Sink bugfix plus tests errors on Windows + * ++[++https://issues.apache.org/jira/browse/FLUME-2135[FLUME-2135]++]++ - Add zip to the build distribution for Windows support + * ++[++https://issues.apache.org/jira/browse/FLUME-2136[FLUME-2136]++]++ - Windows - Fix intermitent test failure in TestMonitoredCounterGroup.java + * ++[++https://issues.apache.org/jira/browse/FLUME-2137[FLUME-2137]++]++ - Fix StagedInstall.java to invoke the correct startup script on Windows + * ++[++https://issues.apache.org/jira/browse/FLUME-2142[FLUME-2142]++]++ - HTTPS tests for http source + * ++[++https://issues.apache.org/jira/browse/FLUME-2145[FLUME-2145]++]++ - TestCheckpointRebuilder.testFastReplay fails on Windows due to checkpoint file being memory mapped + * ++[++https://issues.apache.org/jira/browse/FLUME-2151[FLUME-2151]++]++ - Windows: Update TestExecSource to use native commands on Windows + * ++[++https://issues.apache.org/jira/browse/FLUME-2152[FLUME-2152]++]++ - Flume user guide says "Ganglia support" where it should say "JSON support" + * ++[++https://issues.apache.org/jira/browse/FLUME-2156[FLUME-2156]++]++ - Unregister then re-register MonitoredCounterGroup JMX MBeans on reconfigure + * ++[++https://issues.apache.org/jira/browse/FLUME-2157[FLUME-2157]++]++ - Spool directory source does not shut down correctly when Flume is reconfigured + * ++[++https://issues.apache.org/jira/browse/FLUME-2159[FLUME-2159]++]++ - Sporadic failures in TestNettyAvroRpcClient.spinThreadsCrazily() + * ++[++https://issues.apache.org/jira/browse/FLUME-2161[FLUME-2161]++]++ - Flume does not support spaces in -X java-opt command line args + * ++[++https://issues.apache.org/jira/browse/FLUME-2172[FLUME-2172]++]++ - Update protocol buffer from 2.4.1 to 2.5.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2176[FLUME-2176]++]++ - SpoolDir Source, get 'File has changed' exception but actually there is no change on the file + * ++[++https://issues.apache.org/jira/browse/FLUME-2182[FLUME-2182]++]++ - Spooling Directory Source will not ingest data completely when a wide character appears at the edge of a buffer + * ++[++https://issues.apache.org/jira/browse/FLUME-2184[FLUME-2184]++]++ - flume-ng-morphline-solr-sink Build failing due to incorrect hadoop-common dependency declaration + * ++[++https://issues.apache.org/jira/browse/FLUME-2191[FLUME-2191]++]++ - HDFS Minicluster tests failing after protobuf upgrade. + * ++[++https://issues.apache.org/jira/browse/FLUME-2192[FLUME-2192]++]++ - AbstractSinkProcessor stop incorrectly calls start + * ++[++https://issues.apache.org/jira/browse/FLUME-2198[FLUME-2198]++]++ - Avro Source should disable itself if ipFilterRules contains invalid rules + * ++[++https://issues.apache.org/jira/browse/FLUME-2199[FLUME-2199]++]++ - Flume builds with new version require mvn install before site can be generated + * ++[++https://issues.apache.org/jira/browse/FLUME-2200[FLUME-2200]++]++ - HTTP Source should be able to use "port" parameter if SSL is enabled + * ++[++https://issues.apache.org/jira/browse/FLUME-2208[FLUME-2208]++]++ - Jetty's default SocketSelector leaks File descriptors + * ++[++https://issues.apache.org/jira/browse/FLUME-2209[FLUME-2209]++]++ - AsyncHBaseSink will never recover if the column family does not exists for the first start + * ++[++https://issues.apache.org/jira/browse/FLUME-2210[FLUME-2210]++]++ - UnresolvedAddressException when using multiple hostNames in Elasticsearch sink configuration + * ++[++https://issues.apache.org/jira/browse/FLUME-2220[FLUME-2220]++]++ - ElasticSearch sink - duplicate fields in indexed document + * ++[++https://issues.apache.org/jira/browse/FLUME-2229[FLUME-2229]++]++ - Backoff period gets reset too often in OrderSelector + * ++[++https://issues.apache.org/jira/browse/FLUME-2233[FLUME-2233]++]++ - MemoryChannel lock contention on every put due to bytesRemaining Semaphore + * ++[++https://issues.apache.org/jira/browse/FLUME-2235[FLUME-2235]++]++ - idleFuture should be cancelled at the start of append + * ++[++https://issues.apache.org/jira/browse/FLUME-2238[FLUME-2238]++]++ - Provide option to configure worker threads in NettyAvroRpcClient + * ++[++https://issues.apache.org/jira/browse/FLUME-2239[FLUME-2239]++]++ - Clarify File Channel's dataDirs setting in User Guide + * ++[++https://issues.apache.org/jira/browse/FLUME-2252[FLUME-2252]++]++ - Add null check before closing table in HbaseSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2253[FLUME-2253]++]++ - Please delete old releases from mirroring system + * ++[++https://issues.apache.org/jira/browse/FLUME-2255[FLUME-2255]++]++ - Spooling Directory Source cannot handle channel exceptions + * ++[++https://issues.apache.org/jira/browse/FLUME-2259[FLUME-2259]++]++ - transaction closure not happening for all the scenario in hbasesink + * ++[++https://issues.apache.org/jira/browse/FLUME-2262[FLUME-2262]++]++ - Log4j Appender should use timeStamp field not getTimestamp + * ++[++https://issues.apache.org/jira/browse/FLUME-2263[FLUME-2263]++]++ - Bump Hadoop 2 version to 2.3.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2264[FLUME-2264]++]++ - Log4j Appender {plus} Avro Reflection on string results in an invalid avro schema + * ++[++https://issues.apache.org/jira/browse/FLUME-2265[FLUME-2265]++]++ - Closed bucket writers should be removed from sfwriters map + * ++[++https://issues.apache.org/jira/browse/FLUME-2266[FLUME-2266]++]++ - Update Morphline Sink to kite-0.10.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2270[FLUME-2270]++]++ - Twitter Source Documentation Does not load properly + * ++[++https://issues.apache.org/jira/browse/FLUME-2272[FLUME-2272]++]++ - Getting start page returning 503 error + * ++[++https://issues.apache.org/jira/browse/FLUME-2283[FLUME-2283]++]++ - Spool Dir source must check interrupt flag before writing to channel + * ++[++https://issues.apache.org/jira/browse/FLUME-2289[FLUME-2289]++]++ - Disable maxUnderReplication test which is extremely flakey + * ++[++https://issues.apache.org/jira/browse/FLUME-2301[FLUME-2301]++]++ - Update HBaseSink tests to reflect sink returning backoff only on empty batches + * ++[++https://issues.apache.org/jira/browse/FLUME-2302[FLUME-2302]++]++ - TestHDFS Sink fails with Can't get Kerberos realm + * ++[++https://issues.apache.org/jira/browse/FLUME-2303[FLUME-2303]++]++ - HBaseSink tests can fail based on order of execution + * ++[++https://issues.apache.org/jira/browse/FLUME-2304[FLUME-2304]++]++ - DatasetSink test fails unexpectedly + * ++[++https://issues.apache.org/jira/browse/FLUME-2305[FLUME-2305]++]++ - BucketWriter++#++close must cancel idleFuture + * ++[++https://issues.apache.org/jira/browse/FLUME-2307[FLUME-2307]++]++ - Remove Log writetimeout + * ++[++https://issues.apache.org/jira/browse/FLUME-2311[FLUME-2311]++]++ - Use standard way of finding queue/topic + * ++[++https://issues.apache.org/jira/browse/FLUME-2312[FLUME-2312]++]++ - Add utility for adorning HTTP contexts in Jetty + * ++[++https://issues.apache.org/jira/browse/FLUME-2314[FLUME-2314]++]++ - Upgrade to Mapdb 0.9.9 + * ++[++https://issues.apache.org/jira/browse/FLUME-2320[FLUME-2320]++]++ - Deadlock in DatasetSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2323[FLUME-2323]++]++ - Morphline sink must increment eventDrainAttemptCount when it takes event from channel + * ++[++https://issues.apache.org/jira/browse/FLUME-2324[FLUME-2324]++]++ - Support writing to multiple HBase clusters using HBaseSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2325[FLUME-2325]++]++ - BucketWriter might throw BucketClosedException incorrectly + * ++[++https://issues.apache.org/jira/browse/FLUME-2328[FLUME-2328]++]++ - FileChannel Dual Checkpoint Backup Thread not released on Application stop + * ++[++https://issues.apache.org/jira/browse/FLUME-2329[FLUME-2329]++]++ - Add an alias for the Morphline Solr Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2330[FLUME-2330]++]++ - Remove the MorphlineHandlerImpl configuration option from MorphlineSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2334[FLUME-2334]++]++ - Upgrade Asynchbase to 1.5.0 as this include hbase 0.96.x support + * ++[++https://issues.apache.org/jira/browse/FLUME-2335[FLUME-2335]++]++ - TestHBaseSink++#++testWithoutConfigurationObject() must delete the table at the end of the test + * ++[++https://issues.apache.org/jira/browse/FLUME-2336[FLUME-2336]++]++ - HBase tests that pass in ZK configs must use a new context object + * ++[++https://issues.apache.org/jira/browse/FLUME-2338[FLUME-2338]++]++ - Support coalescing increments in HBaseSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2345[FLUME-2345]++]++ - Update to Kite 0.12.0 dependency + * ++[++https://issues.apache.org/jira/browse/FLUME-2347[FLUME-2347]++]++ - Add FLUME++_++JAVA++_++OPTS which allows users to inject java properties from cmd line + * ++[++https://issues.apache.org/jira/browse/FLUME-2350[FLUME-2350]++]++ - Consume Order tests need to space out file creation + * ++[++https://issues.apache.org/jira/browse/FLUME-2357[FLUME-2357]++]++ - HDFS sink should retry closing files that previously had close errors + * ++[++https://issues.apache.org/jira/browse/FLUME-2381[FLUME-2381]++]++ - Upgrade Hadoop version in Hadoop 2 profile to 2.4.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2379[FLUME-2379]++]++ - Flume's pom files are invalid and not parseable by non-maven build tools +++**++ Documentation:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1223[FLUME-1223]++]++ - Userguide improvement rolling file sink + * ++[++https://issues.apache.org/jira/browse/FLUME-1678[FLUME-1678]++]++ - Incorrect documentation for HBase sink + * ++[++https://issues.apache.org/jira/browse/FLUME-1851[FLUME-1851]++]++ - User Guide grammar mistake + * ++[++https://issues.apache.org/jira/browse/FLUME-2064[FLUME-2064]++]++ - Typo/Grammar in flume main user doc under Scribe + * ++[++https://issues.apache.org/jira/browse/FLUME-2065[FLUME-2065]++]++ - Regex Extractor Interceptor config agent name inconsistent with rest of docs + * ++[++https://issues.apache.org/jira/browse/FLUME-2183[FLUME-2183]++]++ - Add "Other Resources" page to wiki + * ++[++https://issues.apache.org/jira/browse/FLUME-2278[FLUME-2278]++]++ - Incorrect documentation for write-timeout of File Channel + * ++[++https://issues.apache.org/jira/browse/FLUME-2319[FLUME-2319]++]++ - Incorrect property name of Ganglia Reporting documentation diff --git a/src/site/antora/modules/ROOT/pages/releases/1.5.2.adoc b/src/site/antora/modules/ROOT/pages/releases/1.5.2.adoc new file mode 100644 index 0000000000..e5a8d1f23e --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.5.2.adoc @@ -0,0 +1,47 @@ +//// + 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. +//// + += Version 1.5.2 + +*Status of this release* + +Apache Flume 1.5.2 is the eighth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.5.2 is production-ready software. + +Apache Flume 1.5.2 is a maintenance and security release that disables SSLv3 for all security-enabled Flume +sources and sinks. + +*Release Documentation* + +* link:content/1.5.2/FlumeUserGuide.html[Flume 1.5.2 User Guide] (also in link:content/1.5.2/FlumeUserGuide.pdf[pdf]) +* link:content/1.5.2/FlumeDeveloperGuide.html[Flume 1.5.2 Developer Guide] (also in link:content/1.5.2/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.5.2/apidocs/index.html[Flume 1.5.2 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.5.2 + +____ +* ++[++https://issues.apache.org/jira/browse/FLUME-2547[FLUME-2547]++]++ - Removing SSLv2Hello causes Java 6 clients to break +* ++[++https://issues.apache.org/jira/browse/FLUME-2548[FLUME-2548]++]++ - Enable SSLv2Hello for Avro Source and NettyAvroRpcClient +* ++[++https://issues.apache.org/jira/browse/FLUME-2549[FLUME-2549]++]++ - Enable SSLv2Hello for HttpSource +* ++[++https://issues.apache.org/jira/browse/FLUME-2551[FLUME-2551]++]++ - Add dev-support to src tarball +* ++[++https://issues.apache.org/jira/browse/FLUME-2441[FLUME-2441]++]++ - Unit test TestHTTPSource.java failed with IBM JDK 1.7 +* ++[++https://issues.apache.org/jira/browse/FLUME-2520[FLUME-2520]++]++ - HTTP Source should be able to block a prefixed set of protocols. +* ++[++https://issues.apache.org/jira/browse/FLUME-2533[FLUME-2533]++]++ - HTTPS tests fail on Java 6 +* ++[++https://issues.apache.org/jira/browse/FLUME-2511[FLUME-2511]++]++ - Allow configuration of enabled protocols in Avro source and Rpc client +____ diff --git a/src/site/antora/modules/ROOT/pages/releases/1.6.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.6.0.adoc new file mode 100644 index 0000000000..50e60ca612 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.6.0.adoc @@ -0,0 +1,147 @@ +//// + 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. +//// + += Version 1.6.0 + +*Status of this release* + +Apache Flume 1.6.0 is the ninth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.6.0 is production-ready software. + +*Release Documentation* + +* link:content/1.6.0/FlumeUserGuide.html[Flume 1.6.0 User Guide] (also in link:content/1.6.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.6.0/FlumeDeveloperGuide.html[Flume 1.6.0 Developer Guide] (also in link:content/1.6.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.6.0/apidocs/index.html[Flume 1.6.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.6.0 + +++**++ Sub-task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2250[FLUME-2250]++]++ - Add support for Kafka Source + * ++[++https://issues.apache.org/jira/browse/FLUME-2251[FLUME-2251]++]++ - Add support for Kafka Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2677[FLUME-2677]++]++ - Update versions in 1.6.0 branch + * ++[++https://issues.apache.org/jira/browse/FLUME-2686[FLUME-2686]++]++ - Update KEYS file for 1.6 release +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1793[FLUME-1793]++]++ - Unit test TestElasticSearchLogStashEventSerializer fails with IBM JDK + * ++[++https://issues.apache.org/jira/browse/FLUME-1934[FLUME-1934]++]++ - Spoolingdir source exception when reading multiple zero size files + * ++[++https://issues.apache.org/jira/browse/FLUME-2024[FLUME-2024]++]++ - Add ExecSource flush timeout to Flume User Guide + * ++[++https://issues.apache.org/jira/browse/FLUME-2126[FLUME-2126]++]++ - Problem in elasticsearch sink when the event body is a complex field + * ++[++https://issues.apache.org/jira/browse/FLUME-2148[FLUME-2148]++]++ - Windows : Add flume-env.ps1 + * ++[++https://issues.apache.org/jira/browse/FLUME-2214[FLUME-2214]++]++ - FileChannelIntegrityTool needs documentation in user guide + * ++[++https://issues.apache.org/jira/browse/FLUME-2245[FLUME-2245]++]++ - HDFS files with errors unable to close + * ++[++https://issues.apache.org/jira/browse/FLUME-2337[FLUME-2337]++]++ - export JAVA++_++HOME in flume-env.sh.template and increase heap size + * ++[++https://issues.apache.org/jira/browse/FLUME-2346[FLUME-2346]++]++ - idLogFileMap in Log can lose track of file ids + * ++[++https://issues.apache.org/jira/browse/FLUME-2404[FLUME-2404]++]++ - Default maxReadBufferBytes might cause OOM and cause scribe source exit + * ++[++https://issues.apache.org/jira/browse/FLUME-2408[FLUME-2408]++]++ - Remove FLUME-1899 from Flume 1.5.0 change log. + * ++[++https://issues.apache.org/jira/browse/FLUME-2416[FLUME-2416]++]++ - Use CodecPool in compressed stream to prevent leak of direct buffers + * ++[++https://issues.apache.org/jira/browse/FLUME-2420[FLUME-2420]++]++ - HDFSEventSink++#++stop might throw ConcurrentModificationException + * ++[++https://issues.apache.org/jira/browse/FLUME-2425[FLUME-2425]++]++ - FileChannel should trim data and checkpoint directories + * ++[++https://issues.apache.org/jira/browse/FLUME-2432[FLUME-2432]++]++ - Update Kite dependency to 0.15.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2438[FLUME-2438]++]++ - Make Syslog source message body configurable + * ++[++https://issues.apache.org/jira/browse/FLUME-2450[FLUME-2450]++]++ - Improve replay index insertion speed. + * ++[++https://issues.apache.org/jira/browse/FLUME-2466[FLUME-2466]++]++ - Embedded agent name cannot contain spaces + * ++[++https://issues.apache.org/jira/browse/FLUME-2470[FLUME-2470]++]++ - Kafka Sink and Source must use camel case for all configs. + * ++[++https://issues.apache.org/jira/browse/FLUME-2472[FLUME-2472]++]++ - SyslogUtils fails when system locale is not English + * ++[++https://issues.apache.org/jira/browse/FLUME-2475[FLUME-2475]++]++ - toLowerCase/toUpperCase used without Locale parameter to manipulate Enum + * ++[++https://issues.apache.org/jira/browse/FLUME-2479[FLUME-2479]++]++ - Kafka property auto.commit.enable is incorrect for KafkaSource + * ++[++https://issues.apache.org/jira/browse/FLUME-2480[FLUME-2480]++]++ - Typo in file channel exception: "Usable space exhaused" + * ++[++https://issues.apache.org/jira/browse/FLUME-2481[FLUME-2481]++]++ - TestFileChannelEncryption fails with System locale other than en++_++US + * ++[++https://issues.apache.org/jira/browse/FLUME-2482[FLUME-2482]++]++ - Race condition in File Channels' Log.removeOldLogs + * ++[++https://issues.apache.org/jira/browse/FLUME-2486[FLUME-2486]++]++ - TestExecSource fails on some environments + * ++[++https://issues.apache.org/jira/browse/FLUME-2487[FLUME-2487]++]++ - SyslogParser has rounding errors in timestamp parsing + * ++[++https://issues.apache.org/jira/browse/FLUME-2488[FLUME-2488]++]++ - TestElasticSearchRestClient fails on Oracle JDK 8 + * ++[++https://issues.apache.org/jira/browse/FLUME-2489[FLUME-2489]++]++ - Upgrade Apache Curator to 2.6.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2492[FLUME-2492]++]++ - Flume's Kafka Source doesn't account time correctly + * ++[++https://issues.apache.org/jira/browse/FLUME-2495[FLUME-2495]++]++ - Kafka Source may miss events when channel is not available + * ++[++https://issues.apache.org/jira/browse/FLUME-2497[FLUME-2497]++]++ - TCP and UDP syslog sources parsing the timestamp incorrectly + * ++[++https://issues.apache.org/jira/browse/FLUME-2500[FLUME-2500]++]++ - Add a channel that uses Kafka + * ++[++https://issues.apache.org/jira/browse/FLUME-2505[FLUME-2505]++]++ - Test added in FLUME-2502 is flaky + * ++[++https://issues.apache.org/jira/browse/FLUME-2517[FLUME-2517]++]++ - Performance issue: SimpleDateFormat constructor takes 30% of HDFSEventSink.process() + * ++[++https://issues.apache.org/jira/browse/FLUME-2525[FLUME-2525]++]++ - flume should handle a zero byte .flumespool-main.meta file for the spooldir source + * ++[++https://issues.apache.org/jira/browse/FLUME-2538[FLUME-2538]++]++ - TestResettableFileInputStream fails on JDK 8 + * ++[++https://issues.apache.org/jira/browse/FLUME-2556[FLUME-2556]++]++ - TestBucketPath.testDateFormatHours fails intermittently + * ++[++https://issues.apache.org/jira/browse/FLUME-2557[FLUME-2557]++]++ - DatasetSink doesn't work with Kerberos + * ++[++https://issues.apache.org/jira/browse/FLUME-2560[FLUME-2560]++]++ - Kafka channel entries missing for output jar generation + * ++[++https://issues.apache.org/jira/browse/FLUME-2568[FLUME-2568]++]++ - Additional fix for TestReliableSpoolingFileEventReader + * ++[++https://issues.apache.org/jira/browse/FLUME-2578[FLUME-2578]++]++ - Kafka source throws NPE if Kafka record has null key + * ++[++https://issues.apache.org/jira/browse/FLUME-2586[FLUME-2586]++]++ - HDFS Sink should have an option to try rename even if close fails + * ++[++https://issues.apache.org/jira/browse/FLUME-2592[FLUME-2592]++]++ - Specify main manifest attribute in flume tools jar + * ++[++https://issues.apache.org/jira/browse/FLUME-2594[FLUME-2594]++]++ - Close Async HBase Client if there are large number of consecutive timeouts + * ++[++https://issues.apache.org/jira/browse/FLUME-2595[FLUME-2595]++]++ - Add option to checkpoint on file channel shutdown + * ++[++https://issues.apache.org/jira/browse/FLUME-2624[FLUME-2624]++]++ - Improve Hive Sink performance + * ++[++https://issues.apache.org/jira/browse/FLUME-2626[FLUME-2626]++]++ - Remove trustmanager-type from Thrift RPC client + * ++[++https://issues.apache.org/jira/browse/FLUME-2633[FLUME-2633]++]++ - Update Kite dependency to 1.0.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2639[FLUME-2639]++]++ - SecureThriftRpcClient client privileged calls throw IllegalAccessError + * ++[++https://issues.apache.org/jira/browse/FLUME-2645[FLUME-2645]++]++ - ipFilter.rules property name is wrong + * ++[++https://issues.apache.org/jira/browse/FLUME-2654[FLUME-2654]++]++ - Memory channel error message related to byteCapacity needs refining + * ++[++https://issues.apache.org/jira/browse/FLUME-2657[FLUME-2657]++]++ - Upgrade to Hive 1.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2658[FLUME-2658]++]++ - Upgrade to Hbase 1.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2664[FLUME-2664]++]++ - Site profile fails due to dependency issues + * ++[++https://issues.apache.org/jira/browse/FLUME-2665[FLUME-2665]++]++ - Update documentation for hdfs.closeTries based on FLUME-2586 + * ++[++https://issues.apache.org/jira/browse/FLUME-2670[FLUME-2670]++]++ - Modify dependencies to not pull hadoop/hive related jars + * ++[++https://issues.apache.org/jira/browse/FLUME-2673[FLUME-2673]++]++ - Remove unused import in TestLog + * ++[++https://issues.apache.org/jira/browse/FLUME-2678[FLUME-2678]++]++ - Upgrade xalan to 2.7.2 to take care of CVE-2014-0107 vulnerability + * ++[++https://issues.apache.org/jira/browse/FLUME-2679[FLUME-2679]++]++ - Make hbase-1 the default profile +++**++ Dependency upgrade:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2443[FLUME-2443]++]++ - org.apache.hadoop.fs.FSDataOutputStream.sync() is deprecated in hadoop 2.4 +++**++ Documentation:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1594[FLUME-1594]++]++ - Document JMX options + * ++[++https://issues.apache.org/jira/browse/FLUME-2509[FLUME-2509]++]++ - Add description for properties in Failover Sink Processor + * ++[++https://issues.apache.org/jira/browse/FLUME-2630[FLUME-2630]++]++ - Update documentation for Thrift Src/Sink SSL support and Kerberos support + * ++[++https://issues.apache.org/jira/browse/FLUME-2635[FLUME-2635]++]++ - Documentation for zookeeper dynamic configuration in flume + * ++[++https://issues.apache.org/jira/browse/FLUME-2668[FLUME-2668]++]++ - Document SecureThriftRpcClient/SecureRpcClientFactory in Flume Developer Guide +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1334[FLUME-1334]++]++ - Write an startscript for flume agents on Windows + * ++[++https://issues.apache.org/jira/browse/FLUME-1491[FLUME-1491]++]++ - Dynamic configuration from Zookeeper watcher + * ++[++https://issues.apache.org/jira/browse/FLUME-1521[FLUME-1521]++]++ - Document the StressSource + * ++[++https://issues.apache.org/jira/browse/FLUME-1710[FLUME-1710]++]++ - JSONEvent.getBody should not return null + * ++[++https://issues.apache.org/jira/browse/FLUME-1920[FLUME-1920]++]++ - Test case TestFileChannel fails when flume is built from paths containing the string "hadoop" + * ++[++https://issues.apache.org/jira/browse/FLUME-2237[FLUME-2237]++]++ - Example config in User Guide to use same notation for Agent name + * ++[++https://issues.apache.org/jira/browse/FLUME-2246[FLUME-2246]++]++ - event body data size can make it configurable for logger sinker + * ++[++https://issues.apache.org/jira/browse/FLUME-2273[FLUME-2273]++]++ - ElasticSearchSink: Add handling for header substitution in indexName + * ++[++https://issues.apache.org/jira/browse/FLUME-2373[FLUME-2373]++]++ - Enable configuration to switch thrift source serialization protocol + * ++[++https://issues.apache.org/jira/browse/FLUME-2385[FLUME-2385]++]++ - Flume spans log file with "Spooling Directory Source runner has shutdown" messages at INFO level + * ++[++https://issues.apache.org/jira/browse/FLUME-2401[FLUME-2401]++]++ - Optionally Compress Backup Checkpoint + * ++[++https://issues.apache.org/jira/browse/FLUME-2439[FLUME-2439]++]++ - Update DatasetSink for Kite 0.15.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2462[FLUME-2462]++]++ - Remove use of deprecated methods in DatasetSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2463[FLUME-2463]++]++ - Add support for Hive and HBase datasets to DatasetSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2469[FLUME-2469]++]++ - DatasetSink should load dataset when needed, not at startup + * ++[++https://issues.apache.org/jira/browse/FLUME-2499[FLUME-2499]++]++ - Include Kafka Message Key in Event Header, Updated Comments + * ++[++https://issues.apache.org/jira/browse/FLUME-2502[FLUME-2502]++]++ - Spool source's directory listing is inefficient + * ++[++https://issues.apache.org/jira/browse/FLUME-2558[FLUME-2558]++]++ - Update javadoc for StressSource + * ++[++https://issues.apache.org/jira/browse/FLUME-2562[FLUME-2562]++]++ - Metrics for Flafka components + * ++[++https://issues.apache.org/jira/browse/FLUME-2591[FLUME-2591]++]++ - Kite DatasetSink 2.0 + * ++[++https://issues.apache.org/jira/browse/FLUME-2613[FLUME-2613]++]++ - Tool/script for deleting individual message from queue + * ++[++https://issues.apache.org/jira/browse/FLUME-2642[FLUME-2642]++]++ - Limit kerberos relogin attempt +++**++ New Feature:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1734[FLUME-1734]++]++ - Create a Hive Sink based on the new Hive Streaming support + * ++[++https://issues.apache.org/jira/browse/FLUME-2242[FLUME-2242]++]++ - Flume Sink and Source for Apache Kafka + * ++[++https://issues.apache.org/jira/browse/FLUME-2426[FLUME-2426]++]++ - Support interceptors in the Embedded Agent + * ++[++https://issues.apache.org/jira/browse/FLUME-2431[FLUME-2431]++]++ - Add simple regex search-and-replace interceptor + * ++[++https://issues.apache.org/jira/browse/FLUME-2570[FLUME-2570]++]++ - Add option to not pad date fields + * ++[++https://issues.apache.org/jira/browse/FLUME-2574[FLUME-2574]++]++ - SSL Support for Thrift Rpc + * ++[++https://issues.apache.org/jira/browse/FLUME-2631[FLUME-2631]++]++ - End to End authentication in Flume +++**++ Task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2365[FLUME-2365]++]++ - Please create a DOAP file for your TLP + * ++[++https://issues.apache.org/jira/browse/FLUME-2454[FLUME-2454]++]++ - Support batchSize to allow multiple events per transaction to the Kafka Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2455[FLUME-2455]++]++ - Documentation update for Kafka Sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2523[FLUME-2523]++]++ - Document Kafka channel + * ++[++https://issues.apache.org/jira/browse/FLUME-2612[FLUME-2612]++]++ - Update kite to 0.17.1 +++**++ Test:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1501[FLUME-1501]++]++ - Flume Scribe Source needs unit tests. diff --git a/src/site/antora/modules/ROOT/pages/releases/1.7.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.7.0.adoc new file mode 100644 index 0000000000..9e0f64c923 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.7.0.adoc @@ -0,0 +1,141 @@ +//// + 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. +//// + += Version 1.7.0 + +*Status of this release* + +Apache Flume 1.7.0 is the tenth release of Flume as an Apache top-level project +(TLP). Apache Flume 1.7.0 is production-ready software. + +*Release Documentation* + +* link:content/1.7.0/FlumeUserGuide.html[Flume 1.7.0 User Guide] (also in link:content/1.7.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.7.0/FlumeDeveloperGuide.html[Flume 1.7.0 Developer Guide] (also in link:content/1.7.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.7.0/apidocs/index.html[Flume 1.7.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.7.0 + +++**++ New Feature:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2498[FLUME-2498]++]++ - Implement Taildir Source +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1899[FLUME-1899]++]++ - Make SpoolDir work with Sub-Directories + * ++[++https://issues.apache.org/jira/browse/FLUME-2526[FLUME-2526]++]++ - Build flume by jdk 7 in default + * ++[++https://issues.apache.org/jira/browse/FLUME-2628[FLUME-2628]++]++ - Add an optional parameter to specify the expected input text encoding for the netcat sourcef the netcat source + * ++[++https://issues.apache.org/jira/browse/FLUME-2704[FLUME-2704]++]++ - Configurable poll delay for spooling directory source + * ++[++https://issues.apache.org/jira/browse/FLUME-2718[FLUME-2718]++]++ - HTTP Source to support generic Stream Handler + * ++[++https://issues.apache.org/jira/browse/FLUME-2729[FLUME-2729]++]++ - Allow pollableSource backoff times to be configurable + * ++[++https://issues.apache.org/jira/browse/FLUME-2755[FLUME-2755]++]++ - Kafka Source reading multiple topics + * ++[++https://issues.apache.org/jira/browse/FLUME-2781[FLUME-2781]++]++ - A Kafka Channel defined as parseAsFlumeEvent=false cannot be correctly used by a Flume source + * ++[++https://issues.apache.org/jira/browse/FLUME-2799[FLUME-2799]++]++ - Kafka Source - Message Offset and Partition add to headers + * ++[++https://issues.apache.org/jira/browse/FLUME-2801[FLUME-2801]++]++ - Performance improvement on TailDir source + * ++[++https://issues.apache.org/jira/browse/FLUME-2810[FLUME-2810]++]++ - Add static Schema URL to AvroEventSerializer configuration + * ++[++https://issues.apache.org/jira/browse/FLUME-2820[FLUME-2820]++]++ - Support New Kafka APIs + * ++[++https://issues.apache.org/jira/browse/FLUME-2852[FLUME-2852]++]++ - Kafka Source/Sink should optionally read/write Flume records + * ++[++https://issues.apache.org/jira/browse/FLUME-2868[FLUME-2868]++]++ - Kafka Channel partition topic by key + * ++[++https://issues.apache.org/jira/browse/FLUME-2872[FLUME-2872]++]++ - Kafka Sink should be able to select which header as the key + * ++[++https://issues.apache.org/jira/browse/FLUME-2875[FLUME-2875]++]++ - Allow RollingFileSink to specify a file prefix and a file extension. + * ++[++https://issues.apache.org/jira/browse/FLUME-2909[FLUME-2909]++]++ - Bump Rat version + * ++[++https://issues.apache.org/jira/browse/FLUME-2910[FLUME-2910]++]++ - AsyncHBaseSink - Failure callbacks should log the exception that caused them + * ++[++https://issues.apache.org/jira/browse/FLUME-2911[FLUME-2911]++]++ - Add includePattern option in SpoolDirectorySource configuration + * ++[++https://issues.apache.org/jira/browse/FLUME-2918[FLUME-2918]++]++ - TaildirSource is underperforming with huge parent directories + * ++[++https://issues.apache.org/jira/browse/FLUME-2937[FLUME-2937]++]++ - Integrate checkstyle for non-test classes + * ++[++https://issues.apache.org/jira/browse/FLUME-2941[FLUME-2941]++]++ - Integrate checkstyle for test classes + * ++[++https://issues.apache.org/jira/browse/FLUME-2954[FLUME-2954]++]++ - make raw data appearing in log messages explicit + * ++[++https://issues.apache.org/jira/browse/FLUME-2955[FLUME-2955]++]++ - Add file path to the header in TaildirSource + * ++[++https://issues.apache.org/jira/browse/FLUME-2959[FLUME-2959]++]++ - Fix issues with flume-checkstyle module + * ++[++https://issues.apache.org/jira/browse/FLUME-2982[FLUME-2982]++]++ - Add localhost escape sequence to HDFS sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2999[FLUME-2999]++]++ - Kafka channel and sink should enable statically assigned partition per event via header + * ++[++https://issues.apache.org/jira/browse/FLUME-2821[FLUME-2821]++]++ - Flume-Kafka Source with new Consumer + * ++[++https://issues.apache.org/jira/browse/FLUME-2822[FLUME-2822]++]++ - Flume-Kafka-Sink with new Producer + * ++[++https://issues.apache.org/jira/browse/FLUME-2823[FLUME-2823]++]++ - Flume-Kafka-Channel with new APIs +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1668[FLUME-1668]++]++ - Hdfs Sink File Rollover + * ++[++https://issues.apache.org/jira/browse/FLUME-2132[FLUME-2132]++]++ - Exception while syncing from Flume to HDFS + * ++[++https://issues.apache.org/jira/browse/FLUME-2143[FLUME-2143]++]++ - Flume build occasionally fails with OutOfMemoryError on Windows. + * ++[++https://issues.apache.org/jira/browse/FLUME-2215[FLUME-2215]++]++ - ResettableFileInputStream can't support ucs-4 character + * ++[++https://issues.apache.org/jira/browse/FLUME-2318[FLUME-2318]++]++ - SpoolingDirectory is unable to handle empty files + * ++[++https://issues.apache.org/jira/browse/FLUME-2448[FLUME-2448]++]++ - Building flume from trunk failing with dependency error + * ++[++https://issues.apache.org/jira/browse/FLUME-2484[FLUME-2484]++]++ - NullPointerException in Kafka Sink test + * ++[++https://issues.apache.org/jira/browse/FLUME-2485[FLUME-2485]++]++ - Thrift Source tests fail on Oracle JDK 8 + * ++[++https://issues.apache.org/jira/browse/FLUME-2514[FLUME-2514]++]++ - Some TestFileChannelRestart tests are extremely slow + * ++[++https://issues.apache.org/jira/browse/FLUME-2567[FLUME-2567]++]++ - Remove unneeded repository declarations in pom.xml + * ++[++https://issues.apache.org/jira/browse/FLUME-2573[FLUME-2573]++]++ - flume-ng --conf parameter is not used when starting a flume agent + * ++[++https://issues.apache.org/jira/browse/FLUME-2593[FLUME-2593]++]++ - ResettableFileInputStream returns negate values from read() method + * ++[++https://issues.apache.org/jira/browse/FLUME-2619[FLUME-2619]++]++ - Spooldir source does not log channel exceptions + * ++[++https://issues.apache.org/jira/browse/FLUME-2632[FLUME-2632]++]++ - High CPU on KafkaSink + * ++[++https://issues.apache.org/jira/browse/FLUME-2652[FLUME-2652]++]++ - Documented transaction handling semantics incorrect + * ++[++https://issues.apache.org/jira/browse/FLUME-2660[FLUME-2660]++]++ - Add documentation for EventValidator + * ++[++https://issues.apache.org/jira/browse/FLUME-2672[FLUME-2672]++]++ - NPE in KafkaSourceCounter + * ++[++https://issues.apache.org/jira/browse/FLUME-2712[FLUME-2712]++]++ - Optional channel errors slows down the Source to Main channel event rate + * ++[++https://issues.apache.org/jira/browse/FLUME-2725[FLUME-2725]++]++ - HDFS Sink does not use configured timezone for rounding + * ++[++https://issues.apache.org/jira/browse/FLUME-2732[FLUME-2732]++]++ - Make maximum tolerated failures before shutting down and recreating client in AsyncHbaseSink configurable + * ++[++https://issues.apache.org/jira/browse/FLUME-2734[FLUME-2734]++]++ - Kafka Channel timeout property is overridden by default value + * ++[++https://issues.apache.org/jira/browse/FLUME-2738[FLUME-2738]++]++ - Async HBase sink FD leak on client shutdown + * ++[++https://issues.apache.org/jira/browse/FLUME-2746[FLUME-2746]++]++ - How to include this Flume Patch in Flume 1.5.2 ? + * ++[++https://issues.apache.org/jira/browse/FLUME-2749[FLUME-2749]++]++ - Kerberos configuration error when using short names in multiple HDFS Sinks + * ++[++https://issues.apache.org/jira/browse/FLUME-2751[FLUME-2751]++]++ - Upgrade Derby version to 10.11.1.1 + * ++[++https://issues.apache.org/jira/browse/FLUME-2753[FLUME-2753]++]++ - Error when specifying empty replace string in Search and Replace Interceptor + * ++[++https://issues.apache.org/jira/browse/FLUME-2754[FLUME-2754]++]++ - Hive Sink skipping first transaction in each Batch of Hive Transactions + * ++[++https://issues.apache.org/jira/browse/FLUME-2761[FLUME-2761]++]++ - Move Hive sink out of preview mode + * ++[++https://issues.apache.org/jira/browse/FLUME-2763[FLUME-2763]++]++ - flume++_++env script should handle jvm parameters like -javaagent -agentpath -agentlib + * ++[++https://issues.apache.org/jira/browse/FLUME-2773[FLUME-2773]++]++ - TailDirSource throws FileNotFound Exception if ~/.flume directory is not created already + * ++[++https://issues.apache.org/jira/browse/FLUME-2797[FLUME-2797]++]++ - SyslogTcpSource uses Deprecated Class {plus} Deprecate SyslogTcpSource + * ++[++https://issues.apache.org/jira/browse/FLUME-2798[FLUME-2798]++]++ - Malformed Syslog messages can lead to OutOfMemoryException + * ++[++https://issues.apache.org/jira/browse/FLUME-2804[FLUME-2804]++]++ - Hive sink - abort remaining transactions on shutdown + * ++[++https://issues.apache.org/jira/browse/FLUME-2806[FLUME-2806]++]++ - flume-ng.ps1 Error running script to start an agent on Windows + * ++[++https://issues.apache.org/jira/browse/FLUME-2835[FLUME-2835]++]++ - Hive Sink tests need to create table with transactional property set + * ++[++https://issues.apache.org/jira/browse/FLUME-2841[FLUME-2841]++]++ - Upgrade commons-collections to 3.2.2 + * ++[++https://issues.apache.org/jira/browse/FLUME-2844[FLUME-2844]++]++ - ChannelCounter of SpillableMemoryChannel doesn't register actually. + * ++[++https://issues.apache.org/jira/browse/FLUME-2881[FLUME-2881]++]++ - Windows Launch Script fails in plugins dir code + * ++[++https://issues.apache.org/jira/browse/FLUME-2886[FLUME-2886]++]++ - Optional Channels can cause OOMs + * ++[++https://issues.apache.org/jira/browse/FLUME-2889[FLUME-2889]++]++ - Fixes to DateTime computations + * ++[++https://issues.apache.org/jira/browse/FLUME-2891[FLUME-2891]++]++ - Revert FLUME-2712 and FLUME-2886 + * ++[++https://issues.apache.org/jira/browse/FLUME-2897[FLUME-2897]++]++ - AsyncHBase sink NPE when Channel.getTransaction() fails + * ++[++https://issues.apache.org/jira/browse/FLUME-2901[FLUME-2901]++]++ - Document Kerberos setup for Kafka channel + * ++[++https://issues.apache.org/jira/browse/FLUME-2908[FLUME-2908]++]++ - NetcatSource - SocketChannel not closed when session is broken + * ++[++https://issues.apache.org/jira/browse/FLUME-2913[FLUME-2913]++]++ - Flume classpath too long + * ++[++https://issues.apache.org/jira/browse/FLUME-2915[FLUME-2915]++]++ - The kafka channel using new APIs will be stuck when the sink is avro sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2920[FLUME-2920]++]++ - Kafka Channel Should Not Commit Offsets When Stopping + * ++[++https://issues.apache.org/jira/browse/FLUME-2922[FLUME-2922]++]++ - HDFSSequenceFile Should Sync Writer + * ++[++https://issues.apache.org/jira/browse/FLUME-2923[FLUME-2923]++]++ - Bump AsyncHBase version + * ++[++https://issues.apache.org/jira/browse/FLUME-2936[FLUME-2936]++]++ - KafkaSource tests arbitrarily fail + * ++[++https://issues.apache.org/jira/browse/FLUME-2939[FLUME-2939]++]++ - Upgrade recursive SpoolDir to use Java7 features + * ++[++https://issues.apache.org/jira/browse/FLUME-2948[FLUME-2948]++]++ - Docs: Fixed parameters on Replicating Channel Selector documentation example + * ++[++https://issues.apache.org/jira/browse/FLUME-2949[FLUME-2949]++]++ - Flume fails to build on Windows + * ++[++https://issues.apache.org/jira/browse/FLUME-2950[FLUME-2950]++]++ - ReliableSpoolingFileEventReader.rollCurrentFile is broken + * ++[++https://issues.apache.org/jira/browse/FLUME-2952[FLUME-2952]++]++ - SyslogAgent possible NPE on stop() + * ++[++https://issues.apache.org/jira/browse/FLUME-2972[FLUME-2972]++]++ - Handle offset migration in the new Kafka Channel + * ++[++https://issues.apache.org/jira/browse/FLUME-2974[FLUME-2974]++]++ - Some tests are broken in TestReliableSpoolingFileEventReader and TestSpoolingFileLineReader + * ++[++https://issues.apache.org/jira/browse/FLUME-2983[FLUME-2983]++]++ - Handle offset migration in the new Kafka Source +++**++ Documentation:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2575[FLUME-2575]++]++ - FLUME-2548 brings SSLv2Hello back for Avro Sink, but UG says it is one of the protocols to exclude + * ++[++https://issues.apache.org/jira/browse/FLUME-2713[FLUME-2713]++]++ - Document Fault Tolerant Config parameters in FlumeUserGuide + * ++[++https://issues.apache.org/jira/browse/FLUME-2737[FLUME-2737]++]++ - Documentation for Pollable Source config parameters introduced in FLUME-2729 + * ++[++https://issues.apache.org/jira/browse/FLUME-2783[FLUME-2783]++]++ - Update Website Team page with new Committer's + * ++[++https://issues.apache.org/jira/browse/FLUME-2890[FLUME-2890]++]++ - Typo in Twitter source warning + * ++[++https://issues.apache.org/jira/browse/FLUME-2934[FLUME-2934]++]++ - Document new cachePatternMatching option for TaildirSource + * ++[++https://issues.apache.org/jira/browse/FLUME-2963[FLUME-2963]++]++ - FlumeUserGuide - error in Kafka Source properties table + * ++[++https://issues.apache.org/jira/browse/FLUME-2971[FLUME-2971]++]++ - Document secure Kafka Sink/Source/Channel setup + * ++[++https://issues.apache.org/jira/browse/FLUME-2975[FLUME-2975]++]++ - Minor mistake in NetCat Source example in documentation + * ++[++https://issues.apache.org/jira/browse/FLUME-2998[FLUME-2998]++]++ - Add missing configuration parameter to SequenceSource docs +++**++ Task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2935[FLUME-2935]++]++ - Bump java target version to 1.7 +++**++ Test:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3003[FLUME-3003]++]++ - testSourceCounter in TestSyslogUdpSource is flaky diff --git a/src/site/antora/modules/ROOT/pages/releases/1.8.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.8.0.adoc new file mode 100644 index 0000000000..6b7164c900 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.8.0.adoc @@ -0,0 +1,88 @@ +//// + 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. +//// + += Version 1.8.0 + +*Status of this release* + +Apache Flume 1.8.0 is the eleventh release of Flume as an Apache top-level project +(TLP). Apache Flume 1.8.0 is production-ready software. + +*Release Documentation* + +* link:content/1.8.0/FlumeUserGuide.html[Flume 1.8.0 User Guide] (also in link:content/1.8.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.8.0/FlumeDeveloperGuide.html[Flume 1.8.0 Developer Guide] (also in link:content/1.8.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.8.0/apidocs/index.html[Flume 1.8.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.8.0 + +++**++ New Feature:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2171[FLUME-2171]++]++ - Add Interceptor to remove headers from event + * ++[++https://issues.apache.org/jira/browse/FLUME-2917[FLUME-2917]++]++ - Provide netcat UDP source as alternative to TCP + * ++[++https://issues.apache.org/jira/browse/FLUME-2993[FLUME-2993]++]++ - Support environment variables in configuration files +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1520[FLUME-1520]++]++ - Timestamp interceptor should support custom headers + * ++[++https://issues.apache.org/jira/browse/FLUME-2945[FLUME-2945]++]++ - Bump java target version to 1.8 + * ++[++https://issues.apache.org/jira/browse/FLUME-3020[FLUME-3020]++]++ - Improve HDFSEventSink Escape Ingestion by more then 10x by not getting InetAddress on every record + * ++[++https://issues.apache.org/jira/browse/FLUME-3025[FLUME-3025]++]++ - Expose FileChannel.open on JMX + * ++[++https://issues.apache.org/jira/browse/FLUME-3072[FLUME-3072]++]++ - Add IP address to headers in flume log4j appender + * ++[++https://issues.apache.org/jira/browse/FLUME-3092[FLUME-3092]++]++ - Extend the FileChannel's monitoring metrics + * ++[++https://issues.apache.org/jira/browse/FLUME-3100[FLUME-3100]++]++ - Support arbitrary header substitution for topic of Kafka + * ++[++https://issues.apache.org/jira/browse/FLUME-3144[FLUME-3144]++]++ - Improve Log4jAppender's performance by allowing logging collection of messages +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2620[FLUME-2620]++]++ - File channel throws NullPointerException if a header value is null + * ++[++https://issues.apache.org/jira/browse/FLUME-2752[FLUME-2752]++]++ - Flume AvroSource will leak the memory and the OOM will be happened. + * ++[++https://issues.apache.org/jira/browse/FLUME-2812[FLUME-2812]++]++ - Exception in thread "SinkRunner-PollingRunner-DefaultSinkProcessor" java.lang.Error: Maximum permit count exceeded + * ++[++https://issues.apache.org/jira/browse/FLUME-2857[FLUME-2857]++]++ - Kafka Source/Channel/Sink does not restore default values when live update config + * ++[++https://issues.apache.org/jira/browse/FLUME-2905[FLUME-2905]++]++ - NetcatSource - Socket not closed when an exception is encountered during start() leading to file descriptor leaks + * ++[++https://issues.apache.org/jira/browse/FLUME-2991[FLUME-2991]++]++ - ExecSource command execution starts before starting the sourceCounter + * ++[++https://issues.apache.org/jira/browse/FLUME-3027[FLUME-3027]++]++ - Kafka Channel should clear offsets map after commit + * ++[++https://issues.apache.org/jira/browse/FLUME-3031[FLUME-3031]++]++ - sequence source should reset its counter for event body on channel exception + * ++[++https://issues.apache.org/jira/browse/FLUME-3043[FLUME-3043]++]++ - KafkaSink SinkCallback throws NullPointerException when Log4J level is debug + * ++[++https://issues.apache.org/jira/browse/FLUME-3046[FLUME-3046]++]++ - Kafka Sink and Source Configuration Improvements + * ++[++https://issues.apache.org/jira/browse/FLUME-3049[FLUME-3049]++]++ - Wrapping the exception into SecurityException in UGIExecutor.execute hides the original one + * ++[++https://issues.apache.org/jira/browse/FLUME-3057[FLUME-3057]++]++ - Build fails due to unsupported snappy-java version on ppc64le + * ++[++https://issues.apache.org/jira/browse/FLUME-3080[FLUME-3080]++]++ - Close failure in HDFS Sink might cause data loss + * ++[++https://issues.apache.org/jira/browse/FLUME-3083[FLUME-3083]++]++ - Taildir source can miss events if file updated in same second as file close + * ++[++https://issues.apache.org/jira/browse/FLUME-3085[FLUME-3085]++]++ - HDFS Sink can skip flushing some BucketWriters, might lead to data loss + * ++[++https://issues.apache.org/jira/browse/FLUME-3112[FLUME-3112]++]++ - Upgrade jackson-core library dependency + * ++[++https://issues.apache.org/jira/browse/FLUME-3127[FLUME-3127]++]++ - Upgrade libfb303 library dependency + * ++[++https://issues.apache.org/jira/browse/FLUME-3131[FLUME-3131]++]++ - Upgrade spring framework library dependencies + * ++[++https://issues.apache.org/jira/browse/FLUME-3132[FLUME-3132]++]++ - Upgrade tomcat jasper library dependencies + * ++[++https://issues.apache.org/jira/browse/FLUME-3135[FLUME-3135]++]++ - property logger in org.apache.flume.interceptor.RegexFilteringInterceptor confused + * ++[++https://issues.apache.org/jira/browse/FLUME-3141[FLUME-3141]++]++ - Small typo found in RegexHbaseEventSerializer.java + * ++[++https://issues.apache.org/jira/browse/FLUME-3152[FLUME-3152]++]++ - Add Flume Metric for Backup Checkpoint Errors + * ++[++https://issues.apache.org/jira/browse/FLUME-3155[FLUME-3155]++]++ - Use batch mode in mvn to fix Travis CI error + * ++[++https://issues.apache.org/jira/browse/FLUME-3157[FLUME-3157]++]++ - Refactor TestHDFSEventSinkOnMiniCluster to not use LeaseManager private API + * ++[++https://issues.apache.org/jira/browse/FLUME-3173[FLUME-3173]++]++ - Upgrade joda-time + * ++[++https://issues.apache.org/jira/browse/FLUME-3174[FLUME-3174]++]++ - HdfsSink AWS S3A authentication does not work on JDK 8 + * ++[++https://issues.apache.org/jira/browse/FLUME-3175[FLUME-3175]++]++ - Javadoc generation fails due to Java8's strict doclint +++**++ Documentation:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2175[FLUME-2175]++]++ - Update Developer Guide with notes on how to upgrade Protocol Buffer version + * ++[++https://issues.apache.org/jira/browse/FLUME-2817[FLUME-2817]++]++ - Sink for multi-agent flow example in user guide is set up incorrectly +++**++ Wish:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2579[FLUME-2579]++]++ - JMS source support durable subscriptions and message listening +++**++ Question:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2427[FLUME-2427]++]++ - java.lang.NoSuchMethodException and warning on HDFS (S3) sink +++**++ Task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3093[FLUME-3093]++]++ - Groundwork for version changes in root pom + * ++[++https://issues.apache.org/jira/browse/FLUME-3154[FLUME-3154]++]++ - Add HBase client version check to AsyncHBaseSink and HBaseSink +++**++ Test:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2997[FLUME-2997]++]++ - Fix flaky junit test in SpillableMemoryChannel + * ++[++https://issues.apache.org/jira/browse/FLUME-3002[FLUME-3002]++]++ - Some tests in TestBucketWriter are flaky diff --git a/src/site/antora/modules/ROOT/pages/releases/1.9.0.adoc b/src/site/antora/modules/ROOT/pages/releases/1.9.0.adoc new file mode 100644 index 0000000000..aa52fa3b67 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/1.9.0.adoc @@ -0,0 +1,103 @@ +//// + 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. +//// + += Version 1.9.0 + +*Status of this release* + +Apache Flume 1.9.0 is the eleventh release of Flume as an Apache top-level project +(TLP). Apache Flume 1.9.0 is production-ready software. + +*Release Documentation* + +* link:content/1.9.0/FlumeUserGuide.html[Flume 1.9.0 User Guide] (also in link:content/1.9.0/FlumeUserGuide.pdf[pdf]) +* link:content/1.9.0/FlumeDeveloperGuide.html[Flume 1.9.0 Developer Guide] (also in link:content/1.9.0/FlumeDeveloperGuide.pdf[pdf]) +* link:content/1.9.0/apidocs/index.html[Flume 1.9.0 API Documentation] + +*Changes* + +Release Notes - Flume - Version v1.9.0 + +++**++ New Feature:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2071[FLUME-2071]++]++ - Flume Context doesn't support float or double configuration values. + * ++[++https://issues.apache.org/jira/browse/FLUME-2442[FLUME-2442]++]++ - Need an alternative to providing clear text passwords in flume config + * ++[++https://issues.apache.org/jira/browse/FLUME-3142[FLUME-3142]++]++ - Adding HBase2 sink +++**++ Improvement:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2653[FLUME-2653]++]++ - Allow inUseSuffix to be null/empty + * ++[++https://issues.apache.org/jira/browse/FLUME-2854[FLUME-2854]++]++ - Parameterize jetty version in pom + * ++[++https://issues.apache.org/jira/browse/FLUME-2977[FLUME-2977]++]++ - Upgrade RAT to 0.12 + * ++[++https://issues.apache.org/jira/browse/FLUME-3050[FLUME-3050]++]++ - add counters for error conditions and expose to monitor URL + * ++[++https://issues.apache.org/jira/browse/FLUME-3182[FLUME-3182]++]++ - Please add support for SSL/TLS for syslog (tcp) & multi++_++port syslog (tcp) sources + * ++[++https://issues.apache.org/jira/browse/FLUME-3186[FLUME-3186]++]++ - Make asyncHbaseClient configuration parameters available from flume config + * ++[++https://issues.apache.org/jira/browse/FLUME-3223[FLUME-3223]++]++ - Flume HDFS Sink should retry close prior to performing a recoverLease + * ++[++https://issues.apache.org/jira/browse/FLUME-3227[FLUME-3227]++]++ - Add Rate Limiter to StressSource + * ++[++https://issues.apache.org/jira/browse/FLUME-3239[FLUME-3239]++]++ - Do not rename files in SpoolDirectorySource + * ++[++https://issues.apache.org/jira/browse/FLUME-3246[FLUME-3246]++]++ - Validate flume configuration to prevent larger source batch size than the channel transaction capacity + * ++[++https://issues.apache.org/jira/browse/FLUME-3269[FLUME-3269]++]++ - Support JSSE keystore/trustore -D system properties + * ++[++https://issues.apache.org/jira/browse/FLUME-3275[FLUME-3275]++]++ - Components supporting SSL/TLS should be able to specify protocol list + * ++[++https://issues.apache.org/jira/browse/FLUME-3276[FLUME-3276]++]++ - Components supporting SSL/TLS should be able to specify cipher suite list + * ++[++https://issues.apache.org/jira/browse/FLUME-3280[FLUME-3280]++]++ - Improve maven build to help code reviews by adding static code analyzer to it + * ++[++https://issues.apache.org/jira/browse/FLUME-3281[FLUME-3281]++]++ - Update to Kafka 2.0 client + * ++[++https://issues.apache.org/jira/browse/FLUME-3282[FLUME-3282]++]++ - Use slf4j in every component +++**++ Bug:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1282[FLUME-1282]++]++ - Flume 1.x build fails on Maven 2 + * ++[++https://issues.apache.org/jira/browse/FLUME-2232[FLUME-2232]++]++ - Add findbugs to Flume build + * ++[++https://issues.apache.org/jira/browse/FLUME-2436[FLUME-2436]++]++ - Make hadoop-2 the default build profile + * ++[++https://issues.apache.org/jira/browse/FLUME-2464[FLUME-2464]++]++ - Remove hadoop-2 profile + * ++[++https://issues.apache.org/jira/browse/FLUME-2786[FLUME-2786]++]++ - It will enter a deadlock state when modify the conf file before I stop flume-ng + * ++[++https://issues.apache.org/jira/browse/FLUME-2894[FLUME-2894]++]++ - Flume components should stop in the correct order (graceful shutdown) + * ++[++https://issues.apache.org/jira/browse/FLUME-2973[FLUME-2973]++]++ - Deadlock in hdfs sink + * ++[++https://issues.apache.org/jira/browse/FLUME-2976[FLUME-2976]++]++ - Exception when JMS source tries to connect to a Weblogic server without authentication + * ++[++https://issues.apache.org/jira/browse/FLUME-2988[FLUME-2988]++]++ - Kafka Sink metrics missing eventDrainAttemptCount + * ++[++https://issues.apache.org/jira/browse/FLUME-2989[FLUME-2989]++]++ - Kafka Channel metrics missing eventTakeAttemptCount and eventPutAttemptCount + * ++[++https://issues.apache.org/jira/browse/FLUME-3056[FLUME-3056]++]++ - TestApplication hangs indefinitely + * ++[++https://issues.apache.org/jira/browse/FLUME-3101[FLUME-3101]++]++ - taildir source may endless loop when tail a file + * ++[++https://issues.apache.org/jira/browse/FLUME-3106[FLUME-3106]++]++ - When batchSize of sink greater than transactionCapacity of Memory Channel, Flume can produce endless data + * ++[++https://issues.apache.org/jira/browse/FLUME-3107[FLUME-3107]++]++ - When batchSize of sink greater than transactionCapacity of File Channel, Flume can produce endless data + * ++[++https://issues.apache.org/jira/browse/FLUME-3114[FLUME-3114]++]++ - Upgrade commons-httpclient library dependency + * ++[++https://issues.apache.org/jira/browse/FLUME-3117[FLUME-3117]++]++ - Application can be dead loop when call System.exit() in methodconfigure + * ++[++https://issues.apache.org/jira/browse/FLUME-3133[FLUME-3133]++]++ - Add a ipHeader config in Syslog Sources + * ++[++https://issues.apache.org/jira/browse/FLUME-3201[FLUME-3201]++]++ - Fix SyslogUtil to handle RFC3164 format in december correctly + * ++[++https://issues.apache.org/jira/browse/FLUME-3218[FLUME-3218]++]++ - Fix external process config filter test + * ++[++https://issues.apache.org/jira/browse/FLUME-3222[FLUME-3222]++]++ - java.nio.file.NoSuchFileException thrown when files are being deleted from the TAILDIR source + * ++[++https://issues.apache.org/jira/browse/FLUME-3237[FLUME-3237]++]++ - Handling RuntimeExceptions coming from the JMS provider in JMSSource + * ++[++https://issues.apache.org/jira/browse/FLUME-3253[FLUME-3253]++]++ - JP Morgan Chase scan shows vulnerabilities for Splunk App using Apache Flume 1.8 + * ++[++https://issues.apache.org/jira/browse/FLUME-3265[FLUME-3265]++]++ - Cannot set batch-size for LoadBalancingRpcClient + * ++[++https://issues.apache.org/jira/browse/FLUME-3270[FLUME-3270]++]++ - Close JMS resources in JMSMessageConsumer constructor in case of failure + * ++[++https://issues.apache.org/jira/browse/FLUME-3278[FLUME-3278]++]++ - Handling -D keystore parameters in Kafka components + * ++[++https://issues.apache.org/jira/browse/FLUME-3294[FLUME-3294]++]++ - Fix polling logic in TaildirSource + * ++[++https://issues.apache.org/jira/browse/FLUME-3298[FLUME-3298]++]++ - Make hadoop-common optional in flume-ng-hadoop-credential-store-config-filter + * ++[++https://issues.apache.org/jira/browse/FLUME-3299[FLUME-3299]++]++ - Fix log4j scopes in pom files +++**++ Sub-task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3158[FLUME-3158]++]++ - Upgrade surefire version and config + * ++[++https://issues.apache.org/jira/browse/FLUME-3243[FLUME-3243]++]++ - Increase the default of hdfs.callTimeout and document it's deprecation + * ++[++https://issues.apache.org/jira/browse/FLUME-3303[FLUME-3303]++]++ - Mention future configuration change in the release notes +++**++ Test:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3195[FLUME-3195]++]++ - Split up the TestKafkaChannel class +++**++ Wish:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3087[FLUME-3087]++]++ - Change log level from WARN to INFO when using default "maxIOWorkers" value. +++**++ Task:: + * ++[++https://issues.apache.org/jira/browse/FLUME-3183[FLUME-3183]++]++ - Maven: generate SHA-512 checksum during deploy +++**++ Dependency upgrade:: + * ++[++https://issues.apache.org/jira/browse/FLUME-2698[FLUME-2698]++]++ - Upgrade Jetty Version + * ++[++https://issues.apache.org/jira/browse/FLUME-3115[FLUME-3115]++]++ - Upgrade netty library dependency + * ++[++https://issues.apache.org/jira/browse/FLUME-3194[FLUME-3194]++]++ - upgrade derby to the latest (1.14.1.0) version +++**++ Documentation:: + * ++[++https://issues.apache.org/jira/browse/FLUME-1342[FLUME-1342]++]++ - Document JMX monitoring API + * ++[++https://issues.apache.org/jira/browse/FLUME-2723[FLUME-2723]++]++ - Document the requirement that Channel's transactionCapacity ++>++= batchSize of the source/sink + * ++[++https://issues.apache.org/jira/browse/FLUME-3051[FLUME-3051]++]++ - Mention the incompatibility of Kafka source with 0.8.x Kafka brokers + * ++[++https://issues.apache.org/jira/browse/FLUME-3228[FLUME-3228]++]++ - Incorrect parameter name in timestamp interceptor docs diff --git a/src/site/antora/modules/ROOT/pages/releases/index.adoc b/src/site/antora/modules/ROOT/pages/releases/index.adoc new file mode 100644 index 0000000000..7f8bfcaa3a --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/releases/index.adoc @@ -0,0 +1,42 @@ +//// + 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. +//// + += Releases + +*Current Release* + +The current stable release is xref:releases/1.11.0.adoc[Apache Flume Version 1.11.0]. + +1.11.0 + +*Previous Releases* + +1.10.1 +1.10.0 +1.9.0 +1.8.0 +1.7.0 +1.6.0 +1.5.2 +1.5.0.1 +1.5.0 +1.4.0 +1.3.1 +1.3.0 +1.2.0 +1.1.0 +1.0.0 diff --git a/src/site/antora/modules/ROOT/pages/security.adoc b/src/site/antora/modules/ROOT/pages/security.adoc new file mode 100644 index 0000000000..edece3c221 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/security.adoc @@ -0,0 +1,114 @@ +//// + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +//// + += Apache Flume Security Vulnerabilities + +This page lists all the security vulnerabilities fixed in released versions of Apache Flume. Each vulnerability is given a security impact rating by the Apache Flume security team. Note that this rating may vary from platform to platform. We also list the versions of Apache Flume the flaw is known to affect, and where a flaw has not been verified list the version with a question mark. + +Binary patches are never provided. If you need to apply a source code patch, use the building instructions for the Apache Flume version that you are using. + +If you need help on building or configuring Flume or other help on following the instructions to mitigate the known vulnerabilities listed here, please subscribe to, and send your questions to the public Flume Users mailing list. + +If you have encountered an unlisted security vulnerability or other unexpected behaviour that has security impact, or if the descriptions here are incomplete, please report them privately to the mailto:private@flume.apche.org[Flume SecurityTeam]. Thank you! + +*Fixed in Flume 1.11.0* + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-42468[CVE-2022-42468]: Apache Flume Improper Input Validation (JNDI Injection) in JMSSource. + +[width="100%",cols="54%,46%",options="header",] +|=== +|https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-42468[CVE-2022-42468] |Deserialization of Untrusted Data +|Severity |Moderate +|Base CVSS SCore |6.6 (AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H) +|Versions Affected |Flume 1.4.0 through 1.10.1 +|=== + +*Description* + +Apache Flume versions 1.4.0 through 1.10.1 are vulnerable to a remote code execution (RCE) attack when a configuration uses a JMS Source with an unsafe providerURL. This issue is fixed by limiting JNDI to allow only the use of the java protocol or no protocol. + +*Mitigation* + +Do not use JMSSource or upgrade to Apache Flume 1.11.0 + +*Release Details* + +In release 1.11.0, if a protocol is specified in the providerUrl parameter only the java protocol will be allowed. If no protocol is specified it will also be allowed. + +*Credit* + +This issue was found by nbxiglk. + +*Fixed in Flume 1.10.1* + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-34916[CVE-2022-34916]: Apache Flume vulnerable to a JNDI RCE in JMSMessageConsumer. + +[width="100%",cols="54%,46%",options="header",] +|=== +|https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-34916[CVE-2022-34916] |Deserialization of Untrusted Data +|Severity |Moderate +|Base CVSS SCore |6.6 (AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H) +|Versions Affected |Flume 1.4.0 through 1.10.0 +|=== + +*Description* + +Flume's JMSMessageConsumer class can be configured with a destination name. A JNDI lookup is performed on this name without performing an validation. This could result in untrusted data being deserialized. + +*Mitigation* + +Upgrade to Flume 1.10.1. + +In releases 1.4.0 through 1.10.0 the JMSSource should not be used as it uses JMSMessageConsumer. + +*Release Details* + +In release 1.10.1, if a protocol is specified in the destination name parameter only the java protocol will be allowed. If no protocol is specified it will also be allowed. + +*Credit* + +This issue was found by Frentzen Amaral. + +*Fixed in Flume 1.10.0* + +https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-25167[CVE-2022-25167]: Apache Flume vulnerable to a JNDI RCE in JMSSource. + +[width="100%",cols="54%,46%",options="header",] +|=== +|https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-25167[CVE-2022-25167] |Deserialization of Untrusted Data +|Severity |Moderate +|Base CVSS SCore |6.6 (AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H) +|Versions Affected |Flume 1.4.0 through 1.9.0 +|=== + +*Description* + +Flume's JMSSource class can be configured with a connection factory name. A JNDI lookup is performed on this name without performing an validation. This could result in untrusted data being deserialized. + +*Mitigation* + +Upgrade to Flume 1.10.0. + +In releases 1.4.0 through 1.9.0 the JMSSource should not be used. + +*Release Details* + +In release 1.10.0, if a protocol is specified in the connection factory parameter only the java protocol will be allowed. If no protocol is specified it will also be allowed. + +*Credit* + +This issue was found by the Flume development team. diff --git a/src/site/antora/modules/ROOT/pages/source.adoc b/src/site/antora/modules/ROOT/pages/source.adoc new file mode 100644 index 0000000000..0da517a358 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/source.adoc @@ -0,0 +1,115 @@ +//// + 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. +//// + += Source Repository + +*Overview* + +This project uses http://git-scm.com/[Git] to manage its source code. Instructions on +Git use can be found in the http://git-scm.com/documentation/[Git documentation]. + +*Web Access* + +The following is a link to the online source repository. + +*Anonymous Access* + +Flume maintains an active release branch along with trunk. The release branch represents the list of commits that will go into the next release. +All commits that go into trunk will also have to be committed using git cherry-pick and pushed to the current release branch. +The current release branch is flume-1.9. + +The source can be checked out anonymously from git with this command:: + +.... +$ git clone https://github.com/apache/flume.git +.... + +*Developer Access* + +Everyone can access the Git repository via HTTP, but Committers must clone the git repository via HTTPS.: + +.... +$ git clone git@github.com:apache/flume.git +.... + +Committers should first commit the patch to trunk on your local repo: + +.... +$ git pull +$ git commit -m "A message" +$ git log +.... + +Copy the commit hash of the commit you just made. Then: + +.... +$ git checkout flume-1.9 (or the current release branch) +$ git pull +$ git cherry-pick (This should get committed immediately). +.... + +Now push to both trunk and the release branch: + +.... +$ git push -u origin trunk +$ git push -u origin flume-1.9 +.... + +For more details, please read: https://gitbox.apache.org/[Git at Apache]. + +The committer should make sure the commits are pushed to both branches. Please make sure all commits to the release branch are fast forward commits +and there are no merge commits on the release branch. + +This process requires a little more work, but this guarantees that our release tags will not have accidental and local commits in its history, +as we can force push to the release branches to remove these from history. Ideally we should try to keep the history on release branches linear, +but if at some point we decide to start using feature branches, we might end up having merge commits on these branches too, but that is expected +and required - since that would represent the list of commits for that feature. + +When a release is finalized, the current release branch will be frozen by the release manager for the release, and a new release branch will be +branched off the current release branch. The new branch will represent the next release and all commits not meant for the current release must +go to the new branch once the current branch is frozen. The release manager then pushes release related commits to the current branch. + +For example, if the next release is flume-1.9.0, all commits should go to trunk and flume-1.9. +When the rolling release canidate, the release manager will create a new branch, say flume-1.10 from the latest commit of +flume-1.9. All further non-release related commits should go to trunk and flume-1.10 (unless the release manager thinks otherwise - in which case it can go to flume-1.9 and flume-1.10). + +Please note that the main development branch is *trunk*, not master. + +*Access Through a Proxy* + +The Subversion client can go through a proxy, if you configure it to do so. To configure git to use a proxy: + +.... +$ git config http.proxy address:port +.... + +Then do a git clone as usual: + +.... +$ git clone https://github.com/apache/flume +.... + +*SVN Access* + +If you prefer to use svn and not git, please use the https://github.com/apache/flume[Github mirror] to checkout +the sources. Please read https://github.com/blog/626-announcing-svn-support[this] and https://github.com/blog/626-announcing-svn-support[this] +for details on how to use svn with github. + +*Note 1:* The (erstwhile) Apache Flume http://svn.apache.org/repos/asf/flume/[SVN repository] is no longer updated and should not be used to checkout +the source code. + +*Note 2:* Committers could use either Apache Gitbox or Github repositories. SVN can no longer be used to commit. diff --git a/src/site/antora/modules/ROOT/pages/subprojects.adoc b/src/site/antora/modules/ROOT/pages/subprojects.adoc new file mode 100644 index 0000000000..f0f747d334 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/subprojects.adoc @@ -0,0 +1,23 @@ +//// + 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. +//// + += Sub Projects + +Apache Flume has companion projects that provide extra functionality such as Channels, Sources, and Sinks as well as +ways to integrate with third party functionality. + +flume-spring-boot/index diff --git a/src/site/antora/modules/ROOT/pages/team.adoc b/src/site/antora/modules/ROOT/pages/team.adoc new file mode 100644 index 0000000000..06dd0aa759 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/team.adoc @@ -0,0 +1,75 @@ +//// + 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. +//// + += Team + +____ +A successful project requires many people to play many different roles. Some members write code or documentation, +while others are valuable as testers, submitting patches and suggestions. + +The team is comprised of Members, Committers and Contributors. Members are responsible for making project management +decisions, voting on releases as well as acting as Committers. Committers have direct access to the source code and +actively evolve the codebase. Contributors improve the project through submission of patches and suggestions +to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions +to the project are greatly appreciated. + +The following individuals are recognized as currently active PMC Members or Project Committers. +____ + +[width="100%",cols="30%,25%,20%,25%",options="header",] +|=== +|Name |Email |Id |Role +|Ashish Paliwal |apaliwal at apache.org |apaliwal |Committer +|Balázs Donát Bessenyei |bessbd at apache.org |bessbd |PMC Chair +|Mike Percy |mpercy at apache.org |mpercy |PMC Member +|Ralph Goers |rgoers at apache.org |rgoers |PMC Member +|Sean Busbey |busbey at apache.org |busbey |Committer +|Tristan Stevens |tristan at apache.org |tristan |PMC Member +|=== + +The following individuals are recognized as former PMC Members or Project Committers + +[width="100%",cols="29%,26%,15%,15%,15%",options="header",] +|=== +|Name |Email |Id |Role |Status +|Aaron Kimball |kimballa at apache.org |kimballa |PMC Member |Last active 2011 +|Ahmed Radwan |ahmed at apache.org |ahmed |PMC Member |Last active 2019 +|Andrew Bayer |abayer at apache.org |abayer |PMC Member |Last active 2015 +|Arvind Prabhakar |arvind at apache.org |arvind |PMC Member |Requested to be inactive in 2023 +|Brock Noland |brock at apache.org |brock |PMC Member |Last active 2019 +|Bruce Mitchener |brucem at apache.org |brucem |PMC Member |Last active - project creation +|Denes Arvay |denes at apache.org |denes |PMC Member |Last active 2020 +|Derek Deeter |ddeeter at apache.org |ddeeter |PMC Member |Last active - project creation +|Eric Sammer |esammer at apache.org |esammer |PMC Member |Last active 2017 +|Hari Shreedharan |hshreedharan at apache.org |hshreedharan |PMC Member |Emeritus 2022 +|Henry Robinson |henry at apache.org |henry |PMC Member |Last active - project creation +|Jaroslav Cecho |jarcec at apache.org |jarcec |PMC Member |Last active 2020 +|Johny Rufus |johnyrufus at apache.org |johnyrufus |Committer |Last active 2017 +|Jonathan Hsieh |jmhsieh at apache.org |jmhsieh |PMC Member |Last active 2020 +|Juhani Connolly |juhanic at apache.org |juhanic |PMC Member |Last active 2020 +|Mingjie Lai |mlai at apache.org |mlai |PMC Member |Last active 2012 +|Mubarak Seyed |mubarak at apache.org |mubarak |Committer |Last active 2017 +|Nick Verbeck |nerdynick at apache.org |nerdynick |PMC Member |Last active 2011 +|Patrick Hunt |phunt at apache.org |phunt |PMC Member |Last active 2012 +|Patrick Wendell |pwendell at apache.org |pwendell |Committer |Last active 2015 +|Prasad Mujumdar |prasadm at apache.org |prasadm |PMC Member |Last active 2015 +|Roshan Naik |roshannaik at apache.org |roshannaik |PMC Member |Last active 2017 +|Attila Simon |sati at apache.org |sati |Committer |Last active 2017 +|Ferenc Szabo |szaboferee at apache.org |szaboferee |Committer |Last active 2019 +|Wolfgang Hoschek |whoschek at apache.org |whoschek |Committer |Last active 2016 +|Will McQueen |will at apache.org |will |PMC Member |Last active 2017 +|=== diff --git a/src/site/antora/modules/ROOT/pages/testing.adoc b/src/site/antora/modules/ROOT/pages/testing.adoc new file mode 100644 index 0000000000..4dc104a6a4 --- /dev/null +++ b/src/site/antora/modules/ROOT/pages/testing.adoc @@ -0,0 +1,23 @@ +//// + 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. +//// + += Testing + +The Apache Flume project uses https://travis-ci.com/github/apache/flume[TravisCI] to test the build of [.title-ref]#trunk# branch +and all Pull Requests at GitHub. + +The build and tests are executed on AMD64 and ARM64 CPU architectures.